【问题标题】:My app is working on my android emulator however it is not working on my real mobile device我的应用程序在我的 android 模拟器上运行,但它在我的真实移动设备上不运行
【发布时间】:2019-03-24 17:38:12
【问题描述】:

我的问题是当我在真正的移动设备上运行我的应用程序时,会显示以下错误:com.android.volley.TimeoutError"。但是,它可以通过使用 Android Studio 的模拟器完美运行。由于必须这个错误是由连接问题引起的,我是否为我的应用程序使用了正确的 ip?即

"私有静态字符串 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);

}

}

【问题讨论】:

    标签: java android runtime-error


    【解决方案1】:

    如果您在 Android 9 Pie 中进行测试,则必须在您的 Manifest 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)
    【解决方案2】:

    这是错误的 IP 地址。 10.0.2.2 仅适用于模拟器,因为这是主机和模拟器之间的专用网络 IP。对于 wifi,您需要使用真实 IP 地址并确保 wifi 网络设置为允许该 IP/端口上的传入连接。对于蜂窝网络,您需要确保一直到您的 ISP 都是这种情况

    【讨论】:

    • 感谢您提供此信息,所以如果我将 10.0.2.2 替换为我的 IPv4 地址,它应该可以工作吗?
    • 我已经完成了您建议的操作,但是这次错误出现在模拟器和我的移动设备上。但是错误是 com.android.volley.ClientError ,这可能是因为我必须禁用我的防火墙吗?
    【解决方案3】:

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

    解决方案:

    • 您可以使用 ngrok。基本上,它会创建一个到您的本地主机的隧道,您可以通过该隧道连接到您的本地主机服务器。我亲自将其与托管在 localhost 上的 Flask API 一起使用
    • 您还可以在 AWS(亚马逊网络服务)、Hostinger 或其他云服务上托管您的服务器。我使用 Hostinger 在 PHP 中托管我的 API。

    【讨论】:

      猜你喜欢
      • 2018-10-23
      • 1970-01-01
      • 2017-07-03
      • 2016-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-10
      • 1970-01-01
      相关资源
      最近更新 更多