安卓P网络权限问题

如题所述

第1个回答  2022-06-06
android:usesCleartextTraffic 指示应用程序是否打算使用明文网络流量,例如明文HTTP。目标API级别为27(N)或更低的应用程序的默认值为“ true”。面向API级别28(P)或更高级别的应用默认为“ false”。

当属性设置为“ false”时,平台组件(例如,HTTP和FTP堆栈,DownloadManager和MediaPlayer)将拒绝应用程序使用明文流量的请求。强烈建议第三方库也采用此设置。避免明文通信的主要原因是缺乏机密性,真实性和防篡改保护;网络攻击者可以窃听所传输的数据,并且还可以对其进行修改而不会被检测到。

所以在安卓P之后将禁止APP使用所有未加密的的链接,因此运行安卓P系统的安卓设备无论是接受或者发送流量,未来都不能使用明码传输,需要使用下一代(Transport Layer Security)传输层安全协议,而安卓N和O则不会受到影响。

举例:

在安卓P中使用HttpUrlConnection进行http请求会出现以下异常

W/System.err: java.io.IOException: Cleartext HTTP traffic to **** not permitted

在安卓P中使用OKHttp请求则会出现

java.net.UnknownServiceException: CLEARTEXT communication ** not permitted by network security policy

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

解决方案:

针对这个问题,有以下三种解决方法:

1.APP改用https请求,这个需要服务器也支持

2.targetSdkVersion降低到27以下

3.在清单文件中的application标签中直接插入android:usesCleartextTraffic="true"

network_security_config.xml
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>

<base-config cleartextTrafficPermitted="false"/>
</network-security-config>

在AndroidManifest.xml中,application节点下新增:

android:networkSecurityConfig="@xml/network_security_config"

5.新建res/xml/network_security_config.xml文件,设置网络安全性配置

这个方法跟上面的类似,不同之处在于,方法4将所有域名的http请求都允许了,下面这个方法只允许了指定域名的http请求。

<?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>