最近在Android P系統(tǒng)上使用騰訊IM的時(shí)候壹甥,在聊天界面救巷,發(fā)送語音對(duì)方能聽到,我聽不到句柠。發(fā)送圖片對(duì)方能看到浦译,我這里就是一個(gè)小框,圖片顯示不了溯职。打斷點(diǎn)調(diào)試精盅,錯(cuò)誤日志如下:
java.io.IOException: Cleartext HTTP traffic to xxx.x.xxx.xx not permitted
at com.android.okhttp.HttpHandler$CleartextURLFilter.checkURLPermitted(HttpHandler.java:115)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:458)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:407)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:538)
at com.tencent.imsdk.br.run(Unknown Source:78)
at java.lang.Thread.run(Thread.java:764)
Google了一下,問題原因是在Android P系統(tǒng)中:
默認(rèn)情況下啟用網(wǎng)絡(luò)傳輸層安全協(xié)議 (TLS)
也就是說谜酒,如果我們的應(yīng)用是在Android 9或更高版本為目標(biāo)平臺(tái)叹俏,則默認(rèn)情況下,是不支持HTTP明文請(qǐng)求的僻族。
在Android P使用Glide加載網(wǎng)絡(luò)圖片也遇到了同樣的問題:
java.io.IOException: Cleartext HTTP traffic to img5.duitang.com not permitted
所以根據(jù)原因可以有以下幾種修改方法:
1. 將http請(qǐng)求改為https請(qǐng)求
2. 將targetSdkVersion降到28以下
3. 修改AndroidManifest.xml文件
添加"android:usesCleartextTraffic="true"節(jié)點(diǎn)粘驰,啟用域名明文,支持Http請(qǐng)求述么。
<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
<uses-permission android:name="android.permission.INTERNET" />
<application
...
android:usesCleartextTraffic="true"
...>
...
</application>
</manifest>
4. 新建res/xml/network_security_config.xml文件蝌数,設(shè)置網(wǎng)絡(luò)安全性配置
network_security_config.xml
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<!--Set application-wide security config using base-config tag.-->
<base-config cleartextTrafficPermitted="false"/>
</network-security-config>
在AndroidManifest.xml中,application節(jié)點(diǎn)下新增:
android:networkSecurityConfig="@xml/network_security_config"
5.新建res/xml/network_security_config.xml文件度秘,設(shè)置網(wǎng)絡(luò)安全性配置
這個(gè)方法跟上面的類似顶伞,不同之處在于,方法4將所有域名的http請(qǐng)求都允許了剑梳,下面這個(gè)方法只允許了指定域名的http請(qǐng)求唆貌。
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">(Your URL)xxx.x.xxx.xx</domain>
<domain includeSubdomains="true">x.xxx.xx</domain>
</domain-config>
</network-security-config>
參考文章:
Android 8: Cleartext HTTP traffic not permitted
行為變更:以 API 級(jí)別 28+ 為目標(biāo)的應(yīng)用
Android 8.0 行為變更