在Android P上使用Http

前言

不少同学在适配Android P的时候会遇到not permitted by network security policy问题:

//使用HttpUrlConnection时遇到的异常
 W/System.err: java.io.IOException: Cleartext HTTP traffic to **** not permitted
//使用OkHttp时遇到的异常
java.net.UnknownServiceException: CLEARTEXT communication ** not permitted by network security policy

这是由于我们所使用的接口并非https导致的:

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

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

解决问题

主要方案有三种

  • 使用https
  • target降低至27
  • 允许使用http
    第一种方案当然是最好的了,强烈建议使用该方案。第二种方案也可行,但并不是长久之计,和大应用商店会纷纷效仿Google Play对应用target有限制,所以这只是缓兵之计。但现实往往并不能迅速将所有接口替换为https。所以我们可以采取第三种方案。采用第三种方案需要在 res下新增一个 xml 目录,然后创建一个名为:network_security_config.xml 文件(名字自定) ,内容如下:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true" />
</network-security-config>
然后在AndroidManifest.xml文件下的*application*标签增加以下属性:
<application
...
 android:networkSecurityConfig="@xml/network_security_config"
...
    />

参考链接

上一篇:为Gradle设置镜像,解决jcenter依赖无法下载或者下载过慢问题


下一篇:PB调用WebService示例(含源码)