原因
在新版Android 9.0 (API 28)中,规定所有应用程序默认使用 Https进行网络通信,不能使用Http进行明文通信。这个规定会导致app的Http访问权限受限,进而会抛出异常
W/System.err: java.io.IOException: Cleartext HTTP traffic to www.xxx.com
解决办法
-
改用Https访问,前提是服务器支持Https且有SSL证书,否则会抛出异常
javax.net.ssl.SSLHandshakeException: Handshake failed
-
targetSdkVersion降到27(含)以下
-
自定义网络安全设置①
在 AndroidManifest.xml 的 application 标签中设置 networkSecurityConfig 属性:<application ... android:allowBackup="true" android:icon="${app_icon}" android:label="@string/app_name" android:networkSecurityConfig="@xml/network_security_config" ...> </application>
然后在 res 目录下新建 xml 文件夹,创建 xml 文件 network_security_config.xml 如下:
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <base-config cleartextTrafficPermitted="true"/> </network-security-config>
或将xml中的内容替换成如下:
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <base-config cleartextTrafficPermitted="true"> <trust-anchors> <certificates src="system" /> </trust-anchors> </base-config> </network-security-config>
-
自定义网络安全设置②
在AndroidManifest.xml配置文件的<application>标签中直接插入使用明文通信android:usesCleartextTraffic="true"
<application ... android:allowBackup="true" android:icon="${app_icon}" android:label="@string/app_name" android:usesCleartextTraffic="true" ...> </application>