Android P 适配踩坑记录

使用 org.apache.http.legacy 库在Android 9.0上运行出现崩溃

日志内容

1
java.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/http/message/BasicNameValuePair

问题分析

出现此问题主要是apache的http库在Android 9.0删除导致的,不要在Android 9.0中使用HttpClient访问网络,替换成HttpURLConnection或者OKHttp。

解决方案

如果是引用的第三方库使用HttpClient导致无法回避,则

(1)在build.gradle文件中声明编译时依赖

1
2
3
android {
useLibrary 'org.apache.http.legacy'
}

(2)在AndroidManifest.xml文件的application标签里面添加

1
<uses-libraryandroid:name="org.apache.http.legacy"android:required="false"/>

参考:https://www.cnblogs.com/renhui/p/9798335.html
参考:https://stackoverflow.com/questions/50446148/how-to-use-apache-http-on-android-p
参考:https://juejin.im/post/5b8959f96fb9a019fe685eb3

OKHttp 请求网络 CLEARTEXT communication to host not permitted by network

问题:由于Android P限制了明文流量的网络请求,非加密的流量请求都会被系统禁止掉。

如果当前应用的请求是http请求,而非https,就会导系统禁止当前应用进行该请求,如果WebView的url使用 http协议,同样会出现加载失败,https不受影响。

为此,OkHttp3做了检查,如果使用了明文流量,默认情况下,在Android P版本OkHttp3就抛出异常: CLEARTEXT communication to " + host + " not permitted by network security policy

1
2
3
4
if (!Platform.get().isCleartextTrafficPermitted(host)) {
throw new RouteException(new UnknownServiceException(
"CLEARTEXT communication to " + host + " not permitted by network security policy"));
}

解决:

(1)在res下新建一个xml目录,然后创建一个名为:network_security_config.xml文件,该文件内容如下:

1
2
3
4
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>

(2)然后在AndroidManifest.xmlapplication标签内应用上面的xml配置:

1
2
3
4
5
6
7
8
<application
android:name=".AppApplication"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:networkSecurityConfig="@xml/network_security_config"
android:roundIcon="@mipmap/ic_launcher_round"
android:theme="@style/AppTheme">
</application>

Powered by AppBlog.CN     浙ICP备14037229号

Copyright © 2012 - 2020 APP开发技术博客 All Rights Reserved.

访客数 : | 访问量 :