Android 9.0/P http 网络请求的问题【已解决】
阅读原文时间:2021年04月20日阅读:1

Google表示,为保证用户数据和设备的安全,针对下一代 Android 系统(Android P) 的应用程序,将要求默认使用加密连接,这意味着 Android P 将禁止 App 使用所有未加密的连接,因此运行 Android P 系统的安卓设备无论是接收或者发送流量,未来都不能明码传输,需要使用下一代(Transport Layer Security)传输层安全协议,而 Android Nougat 和 Oreo 则不受影响。

在Android P系统的设备上,如果应用使用的是非加密的明文流量的http网络请求,则会导致该应用无法进行网络请求,https则不会受影响,同样地,如果应用嵌套了webview,webview也只能使用https请求。

有人认为 Android P 上所有的 App 都需要使用 TLS 加密会降低上网体验,事实上这是一种误解,至于 App 对于少数旧服务器的连接如果非要使用明码传输,开发者需要更改 App 的网络安全配置以允许此类连接。

有以下三种解决方案

(1) APP改用https请求。
(2) targetSdkVersion 降到27以下。
(3) 在 res 下新增一个 xml 目录,然后创建一个名为:network_security_config.xml 文件(名字自定) ,内容如下,大概意思就是允许开启http请求。
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true" />
</network-security-config>
然后在APP的AndroidManifest.xml文件下的application标签增加以下属性
<application
...
 android:networkSecurityConfig="@xml/network_security_config"
...
/>

具体问题如下

直接使用HttpURLConnection会出现访问失败的问题

解决问题我这里采用的是第一种方法

具体操作

第一步
用线程开启一个网络延时操作

 new Thread(new Runnable() {
            @Override
            public void run() {
                HttpURLConnection connection = null;
                BufferedReader reader = null;
 try {
                    String str1;
                    str1="http://www.baidu.com";
                    URL url = new URL(str1);
                    connection = (HttpURLConnection) url.openConnection();
                    connection.setRequestMethod("GET");
                    connection.setConnectTimeout(8000);
                    connection.setReadTimeout(8000);
                    InputStream in = connection.getInputStream();
                    System.out.println(in);
                    //下面对获取到的输入流进行读取
                    reader = new BufferedReader(new InputStreamReader(in));
                    StringBuilder response = new StringBuilder();
                    String line;
                    while ((line = reader.readLine()) != null){
                        response.append(line);
                        System.out.println(response);
                    }
                    int a= response.length();
                    String s= String.valueOf(response);
                    showResponse(s);
                } catch (Exception e) {
                    Looper.prepare();
                    Toast.makeText(MainActivity.this,"访问失败!",Toast.LENGTH_LONG).show();
                    Looper.loop();
                    e.printStackTrace();
                }finally {
                    if (reader != null){
                        try {
                            reader.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                    if (connection != null){
                        /**
                         * 因为toast的实现需要在activity的主线程才能正常工作,所以传统的非主线程不能使toast显示在actvity上,通过Handler可以使自定义线程运行于Ui主线程。
                         *   Looper.prepare();
                         *  oast.makeText(MainActivity.this,"访问成功!",Toast.LENGTH_LONG).show();
                         *  Looper.loop();
                         */
                        Looper.prepare();
                      Toast.makeText(MainActivity.this,"访问成功!",Toast.LENGTH_LONG).show();
                      Looper.loop();
                        connection.disconnect();
                    }
                }
            }
        }).start();

第二步 处理方法

   str1="http://www.baidu.com";改成      str1="https://www.baidu.com";

第三步 结果

在此谢谢大家支持!