Hi, I’m Shendi
问题描述
在 Android 中,使用 okhttp 进行 https 请求没有问题,http 请求报错:
java.net.UnknownServiceException: CLEARTEXT communication to 192.168.0.111 not permitted by network security policy
问题原因
从Android 9(API级别28)开始,默认情况下,Android应用不允许进行明文网络流量传输,也就是说不支持http,仅支持https。这是出于安全考虑,因为明文传输可能会使你的数据传输暴露于风险之中。
问题解决
有两个办法,先说最简单的一种
直接在清单文件(AndroidMinifest.xml)的Application中增加 android:usesCleartextTraffic="true"
<application android:usesCleartextTraffic="true">
</application>
这种方法会对应用的所有网络请求开放明文传输,没有更细粒度的控制。这意味着所有的网络请求都可以使用HTTP,而不仅仅是对特定的请求开放。
第二种方法
在你的Android项目的res
目录下创建一个xml
文件夹(如果还没有的话),然后在该文件夹下创建一个名为network_security_config.xml
的文件。文件内容如下:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" />
<certificates src="user" />
</trust-anchors>
</base-config>
</network-security-config>
然后,在你的AndroidManifest.xml文件中添加以下属性:
<application
android:usesCleartextTraffic="true"
android:networkSecurityConfig="@xml/network_security_config">
...
</application>
请注意,这是一个全局的设置,会影响到你的应用所有的网络请求。如果你只是需要对某个特定的请求开放明文网络,你可能需要在代码中更细致地处理这个问题。同时请注意这样做可能会有安全风险,因为它会使你的数据传输暴露在可能的攻击之下。
所以请尽可能的使用https来进行网络请求,这样才能更好的保证数据的安全性。
END