簡體   English   中英

我的應用程序正在我的Android模擬器上工作,但它不能在我的真實移動設備上工作

[英]My app is working on my android emulator however it is not working on my real mobile device

我的問題是,當我在真實的移動設備上運行我的應用程序時,顯示以下錯誤:com.android.volley.TimeoutError“。但是,它通過使用Android工作室的模擬器完美地工作。由於必須有時間這個錯誤是由連接問題引起的,我是否在我的應用程序中使用了correect ip?ie

“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);

}

}

這是錯誤的IP地址。 10.0.2.2僅適用於仿真器,因為它是主機和仿真器之間專用網絡的IP。 對於wifi,您需要使用真實IP地址並確保設置wifi網絡以允許該IP /端口上的傳入連接。 對於蜂窩網絡,您需要確保一直到您的ISP的情況

如果您在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的文件,就像你在Manifest中命名它一樣,從那里你的文件內容應該是這樣的,以啟用所有沒有加密的請求:

<?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>

最可能的錯誤是由於連接問題。 https://10.0.2.2必須是您的本地主機IP地址。 在Android設備上運行的應用程序無法連接到本地主機服務器。

方案:

  • 你可以使用ngrok。 基本上,它會創建一個到本地主機的隧道,您可以通過該隧道連接到本地主機服務器。 我親自將這個用於我在localhost上托管的Flask API
  • 您還可以在AWS(Amazon Web Services),Hostinger或其他雲服務上托管您的服務器。 我用Hostinger在PHP中托管我的API。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM