Мое приложение работает на моем эмуляторе Android, однако оно не работает на моем реальном мобильном устройстве - PullRequest
3 голосов
/ 24 марта 2019

Моя проблема заключается в том, что когда я запускаю свое приложение на реальном мобильном устройстве, отображается следующая ошибка: com.android.volley.TimeoutError ". Однако она отлично работает с использованием эмулятора студии Android. времени, когда эта ошибка вызвана проблемами с подключением, использую ли я правильный 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);

}

}

Ответы [ 3 ]

0 голосов
/ 24 марта 2019

Если вы тестируете в Android 9 Pie, вам нужно будет установить networkSecurityConfig в вашем теге Manifest application, чтобы разрешить все сетевые соединения HTTP и HTTPS. Также проверьте, предоставили ли вы разрешение ИНТЕРНЕТ.

<?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>
0 голосов
/ 24 марта 2019

Скорее всего, ошибка связана с проблемой подключения. https://10.0.2.2 должен быть вашим локальным IP-адресом. Приложение, работающее на вашем устройстве Android, не может подключиться к серверу localhost.

Решения:

  • Вы можете использовать ngrok. По сути, он создает туннель к вашему локальному хосту, через который вы можете подключиться к вашему локальному серверу. Я лично использовал это с моим Flask API, размещенным на localhost
  • Вы также можете разместить свой сервер в AWS (Amazon Web Services), Hostinger или в других облачных сервисах. Я использовал Hostinger для размещения моего API в PHP.
0 голосов
/ 24 марта 2019

Это неправильный IP-адрес.10.0.2.2 будет работать только на эмуляторах, потому что это IP частной сети между хостом и эмулятором.Для Wi-Fi вам нужно использовать реальный IP-адрес и убедиться, что сеть Wi-Fi настроена так, чтобы разрешать входящие соединения на этот IP / порт.Что касается сотовой связи, вам необходимо убедиться, что это так, вплоть до вашего провайдера

...