一、现象
今天用Okhttp3发送http请求时,总是失败。通过调试发现有"CLEARTEXT communication to XX not permitted by network security policy"异常。
二、原因
高版本的Android对网络访问安全策略进行了升级,限制了非加密的流量请求。http为非加密传输,为了提高网络安全性,高版本中要求进行https加密网络传输。因此,进行http请求时会出现异常。
三、解决方法
方法一:降低目标版本,app/build.gradle中targetSdkVersion 设置为27或以下。
方法二:使用HTTPS请求。如果服务器支持HTTPS请求,将HTTP改为HTTPS。
方法三:添加修改.xml文件。
1.添加res/xml/network.xml文件。文件名可以自拟,和后面的配置对应上即可。如果项目中,res文件夹中没有xml文件夹,我们需要在里面创建一个xml文件夹,然后在里面创建一个network.xml文件,network.xml文件中的内容如下:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>
2修改AndroidManifest.xml。在AndroidManifest.xml文件中的application中添加属性 android:networkSecurityConfig="@xml/network",指向上述文件。示例如下:
<application
android:label="@string/app_name"
android:networkSecurityConfig="@xml/network"//添加的代码
</application>