我的应用在安卓模拟器上可以运行,但在真实移动设备上无法运行。

3
我的问题是,当我在真实的移动设备上运行应用程序时,会显示以下错误:com.android.volley.TimeoutError。然而,通过使用Android Studio模拟器可以完美地工作。由于大多数情况下这个错误是由连接问题引起的,所以我是否在使用正确的IP地址来运行我的应用程序?即:
"private static String URL_REGIST ="http://10.0.2.2:81/android_register_login/register.php";
我是应用程序开发的新手,所以任何帮助将不胜感激。下面是register.java的代码,它使用register.php脚本来执行注册。
private EditText name,email,password,c_password;
private Button btn_regist;
private ProgressBar loading;
private static String URL_REGIST ="http://10.0.2.2:81/android_register_login/register.php";
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_register);
    loading = findViewById(R.id.loading);
    name= findViewById(R.id.name);
    email = findViewById(R.id.email);
    password = findViewById(R.id.password);
    c_password = findViewById(R.id.c_password);

    btn_regist =findViewById(R.id.btn_regist);

    btn_regist.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Regist();
        }
    });
}

private void Regist(){
    loading.setVisibility(View.VISIBLE);
    btn_regist.setVisibility(View.GONE);

    final String name = this.name.getText().toString().trim();
    final String email = this.email.getText().toString().trim();
    final String password = this.password.getText().toString().trim();

    StringRequest stringRequest = new StringRequest(Request.Method.POST, URL_REGIST,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                 try {
                     JSONObject jsonObject = new JSONObject(response);
                     String success = jsonObject.getString("success");

                     if(success.equals("1")){
                         Toast.makeText(RegisterActivity.this, "Account Created",Toast.LENGTH_SHORT).show();
                         loading.setVisibility(View.GONE);
                     }
                 }catch (JSONException e) {
                     e.printStackTrace();
                     Toast.makeText(RegisterActivity.this, "Register Error!" + e.toString(),Toast.LENGTH_SHORT).show();
                     loading.setVisibility(View.GONE);
                     btn_regist.setVisibility(View.VISIBLE);

                 }
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {

                    Toast.makeText(RegisterActivity.this, "Register Error!" + error.toString(),Toast.LENGTH_SHORT).show();
                    loading.setVisibility(View.GONE);
                    btn_regist.setVisibility(View.VISIBLE);
                }
            })
    {
        @Override
        protected Map<String, String> getParams() throws AuthFailureError {
            Map<String, String> params = new HashMap<>();
            params.put("name", name);
            params.put("email", email);
            params.put("password", password);

            return params;
        }
    };



    RequestQueue requestQueue = Volley.newRequestQueue(this);


    requestQueue.add(stringRequest);

}

}

3个回答

1
如果您正在测试Android 9 Pie,则需要在清单文件的application标签中设置networkSecurityConfig以允许所有HTTP和HTTPS网络连接。此外,请检查是否已提供INTERNET权限。
<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
    <application android:networkSecurityConfig="@xml/network_security_config">


    </application>
</manifest>

然后,在您的xml文件夹中,您现在必须创建一个名为network_security_config的文件,就像您在清单中命名它的方式一样,从那里,您的文件内容应该像这样,以启用所有不加密的请求:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </base-config>
</network-security-config>

在我的清单文件中,我已经包含了这两行代码: 1)android:usesCleartextTraffic="true" 2)<uses-permission android:name="android.permission.INTERNET"/> - jesmar

0

那是错误的IP地址。10.0.2.2只会在模拟器上工作,因为那是主机和模拟器之间的私有网络IP。对于WiFi,您需要使用真实的IP地址,并确保WiFi网络设置允许在该IP /端口上进行传入连接。对于蜂窝网络,您需要确保一直到您的ISP都允许这种情况发生。


谢谢您提供这些信息,那么如果我用我的IPv4地址替换10.0.2.2,它应该可以工作吗? - jesmar
我已经按照你建议的操作进行了尝试,但是这一次错误在模拟器和我的移动设备上都出现了。然而,错误信息是“com.android.volley.ClientError”,这可能是因为我需要禁用防火墙吗? - jesmar

0

很可能是由于连接问题导致的错误。https://10.0.2.2 必须是您的本地主机IP地址。运行在您的Android设备上的应用程序无法连接到本地主机服务器。

解决方案:

  • 您可以使用ngrok。基本上,它通过隧道创建到您的本地主机,通过该隧道您可以连接到本地主机服务器。我个人已经将其用于托管在本地主机上的Flask API。
  • 您还可以将服务器托管在AWS(Amazon Web Services)、Hostinger或其他云服务上。我曾在Hostinger上托管我的PHP API。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接