Android P 适配踩坑记录
使用 org.apache.http.legacy 库在Android 9.0上运行出现崩溃
日志内容
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文件中声明编译时依赖
android {
useLibrary 'org.apache.http.legacy'
}
(2)在AndroidManifest.xml文件的application标签里面添加
<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
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
文件,该文件内容如下:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>
(2)然后在AndroidManifest.xml
的application
标签内应用上面的xml配置:
<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>
版权声明:
作者:Joe.Ye
链接:https://www.appblog.cn/index.php/2023/03/18/android-p-adaptation-record/
来源:APP全栈技术分享
文章版权归作者所有,未经允许请勿转载。
共有 0 条评论