3
votes

Mon application fonctionne sur mon émulateur Android, mais elle ne fonctionne pas sur mon véritable appareil mobile

Mon problème est que lorsque j'exécute mon application sur un véritable appareil mobile, l'erreur suivante s'affiche: com.android.volley.TimeoutError ". Cependant, cela fonctionne parfaitement en utilisant l'émulateur de studio Android. En raison du fait que doit du temps où cette erreur est causée par des problèmes de connectivité, est-ce que j'utilise l'ip correect pour mon application? ie

"Private static String URL_REGIST =" http://10.0.2.2:81/android_register_login/register.php "; "

Je suis nouveau dans le développement d'applications, donc toute aide serait grandement appréciée. Voici le code pour register.java qui utilise le script register.php qui est utilisé pour effectuer l'enregistrement

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

}

}


0 commentaires

3 Réponses :


0
votes

C'est la mauvaise adresse IP. 10.0.2.2 ne fonctionnera que sur les émulateurs, car c'est l'adresse IP du réseau privé entre l'hôte et l'émulateur. Pour le wifi, vous devez utiliser la véritable adresse IP et vous assurer que le réseau wifi est configuré pour autoriser les connexions entrantes sur cet IP / port. Pour le cellulaire, vous devez vous assurer que c'est le cas jusqu'à votre FAI


2 commentaires

Merci pour ces informations, donc si je remplace 10.0.2.2 par mon adresse IPv4 cela devrait fonctionner?


J'ai effectué l'opération que vous avez suggérée, mais cette fois, l'erreur se produit à la fois sur l'émulateur et sur mon appareil mobile. Cependant, l'erreur est com.android.volley.ClientError, est-ce que c'est parce que je dois désactiver mon pare-feu?



1
votes

Si vous testez dans Android 9 Pie, vous devrez définir un networkSecurityConfig dans votre balise Manifest application pour autoriser toutes les connexions réseau HTTP et HTTPS. Vérifiez également si vous avez fourni l'autorisation INTERNET.

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

Ensuite, dans votre dossier xml, vous devez maintenant créer un fichier nommé network_security_config exactement comme vous l'avez nommé dans le manifeste et à partir de là, le fichier le contenu de votre fichier doit être comme ceci pour activer toutes les requêtes sans chiffrement:

<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
    <application android:networkSecurityConfig="@xml/network_security_config">


    </application>
</manifest>


1 commentaires

Dans mon manifeste, j'ai inclus ces deux lignes: 1) android: usesCleartextTraffic = "true" 2)



0
votes

L'erreur est probablement due à un problème de connectivité. https://10.0.2.2 doit être votre adresse IP d'hôte local. L'application exécutée sur votre appareil Android ne peut pas se connecter à un serveur localhost.

Solutions:

  • Vous pouvez utiliser ngrok. Fondamentalement, il crée un tunnel vers votre hôte local à travers lequel vous pouvez vous connecter à votre serveur localhost. J'ai personnellement utilisé ceci avec mon API Flask hébergée sur localhost
  • Vous pouvez également héberger votre serveur sur AWS (Amazon Web Services), Hostinger ou sur d'autres services cloud. J'ai utilisé Hostinger pour héberger mon API en PHP.

0 commentaires