Volley Не делает запрос на последней версии Android

Я заметил, что мое приложение не работает на Pixel 3. Я зашел в студию Android и эмулировал несколько устройств и заметил, что оно не работает ни на одном устройстве Android Pie (API 28), но отлично работает на любом другом. Я поместил несколько журналов в свой код, и мне показалось, что я не получаю ответа при использовании Volley. Само приложение загружается, но не отображает никаких данных, и я получаю сообщение об ошибке

E/RecyclerView: адаптер не подключен; пропуск макета

Мой код

import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.support.v7.app.AppCompatActivity;
import android.view.WindowManager;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import org.json.JSONArray;
import org.json.JSONObject;

public class MainActivity extends AppCompatActivity {
    DatabaseManagement db;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.activity_main);
        db = new DatabaseManagement(this);
        grabData();
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                Intent i = new Intent(MainActivity.this, com.hellapunk.hellapunk.feature.Main2Activity.class);
                startActivity(i);
                finish();
            }
        }, 3000);
    }

    public void grabData() {
        //Log.i("Made it", "You made it this far");
        String url = "http://hellapunk.com/listallshows.php?id=2018";
        StringRequest sr = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                try {
                    JSONArray showInfo = new JSONArray(response);
                    Log.i("Something", "response");
                    for (int i = 0; i < showInfo.length(); ++i) {
                        JSONObject showInfo1 = showInfo.getJSONObject(i);

                        if ((db.checkShow(showInfo1.getString("show_summary"),
                                showInfo1.getString("show_date"))) > 0) {
                            Log.i("Results", "Show already exists");
                        } else {
                            db.insertShows(showInfo1.getString("show_summary"),
                                    showInfo1.getString("venue_name"),
                                    showInfo1.getString("show_date"),
                                    showInfo1.getString("shows_img"),
                                    showInfo1.getString("venue_address"),
                                    showInfo1.getString("city_name"),
                                    showInfo1.getString("city_region"));
                        }
                    }
                } catch (Exception e) {
                    Log.i("Error", e.getMessage());
                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.i("TAG", ""+error);
            }
        });
        Volley.newRequestQueue(this).add(sr);

    }
}

Я беру данные во время заставки и сохраняю их в локальной базе данных. Затем он вызывается из БД при следующем действии. Любой совет будет оценен!


person j_timko    schedule 14.01.2019    source источник
comment
может быть, вы получаете ошибку безопасности сети. любая ошибка, которую вы получаете?   -  person Farhana Naaz Ansari    schedule 14.01.2019
comment
Как вы думаете, почему эта ошибка как-то связана с Volley?   -  person Henry    schedule 14.01.2019
comment
Любые ошибки в logcat?   -  person KOTIOS    schedule 14.01.2019


Ответы (4)


Это связано с тем, что, начиная с Android P, любой сетевой трафик между вашим приложением и небезопасными пунктами назначения должен быть явно занесен в белый список. См. раздел Защита пользователей с помощью TLS по умолчанию. в Android P.

В вашем коде вы делаете запрос на:

http://hellapunk.com/listallshows.php?id=2018

http:// показывает, что сайт небезопасен. Если вы углубитесь в свой LogCat, вы, скорее всего, найдете такое сообщение, как:

com.android.volley.NoConnectionError: java.io.IOException: Cleartext HTTP traffic to hellapunk.com not permitted
    at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:177)
    at com.android.volley.NetworkDispatcher.processRequest(NetworkDispatcher.java:120)
    at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:87)
 Caused by: java.io.IOException: Cleartext HTTP traffic to hellapunk.com not permitted
    at com.android.okhttp.HttpHandler$CleartextURLFilter.checkURLPermitted(HttpHandler.java:115)
    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:458)
    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:407)
    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:538)
    at com.android.volley.toolbox.HurlStack.executeRequest(HurlStack.java:99)
    at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:131)
    at com.android.volley.NetworkDispatcher.processRequest(NetworkDispatcher.java:120) 
    at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:87) 

Пытаясь сделать это сам, оказалось, что сайт не поддерживает соединения https, поэтому, чтобы получить доступ к этому конкретному серверу из вашего приложения, вам нужно вручную внести домен hellapunk.com в белый список.

В каталоге ресурсов определите XML-документ для конфигурации вашей сетевой безопасности (например, res/xml/network_security_config.xml):

network_security_config.xml:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">hellapunk.com</domain>
    </domain-config>
</network-security-config>

Затем в вашем AndroidManifest.xml для вашего приложения в теге <application> добавьте атрибут:

<application
    android:networkSecurityConfig="@xml/network_security_config"

Затем вам должно быть разрешено делать небезопасные запросы к любому домену, указанному в этом файле.

person Kevin Coppock    schedule 14.01.2019
comment
Спасибо большое! Я не знал о TLS по умолчанию, и в любом случае предпочел бы, чтобы он был таким. Я просто настроил certbot на сервере, чтобы исправить это. Я ценю информацию! - person j_timko; 15.01.2019
comment
Большое спасибо! - person Rasool Mohamed; 20.02.2019
comment
Ах... спас мой день! - person John T; 06.06.2019
comment
Хороший ответ с объяснением. Работает нормально - person Satyam Gondhale; 07.11.2019
comment
Что произойдет, если это только IP-адрес? - person EngineSense; 06.12.2019

Он хорошо работает в Pie Api 28.

network_security_config.xml:

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

AndroidManifest.xml

В теге приложения манифеста Android добавьте эти строки.

 android:networkSecurityConfig="@xml/network_security_config"
 android:usesCleartextTraffic="true"
person Rakesh Yadav    schedule 01.05.2019

Или вы можете использовать атрибут useCleartextTraffic в элементе приложения в манифесте Android. Значение по умолчанию в Android P — «false».

<application
     android:usesCleartextTraffic="true"

</application>

но для этого требуется minSdkVersion 23 или выше.

person Aristo Michael    schedule 18.10.2019
comment
хороший трюк!!! он также работает для xampp localhost, потому что это http. Большое спасибо - person mili; 24.06.2020

Для этой проблемы я использую https, и теперь он работает очень хорошо.

person megyptm    schedule 29.03.2019