Cleartext HTTP traffic to xxx not permitted解决办法

针对AndroidP系统,Google强制应用程序使用加密连接,禁止未加密HTTP请求,以提升数据安全性。此改动影响App网络请求及WebView加载,需使用HTTPS或调整SDK版本及网络安全配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


Android P http网络请求的问题

Google为保证用户数据和设备的安全,针对下一代 Android 系统(Android P) 的应用程序,将要求默认使用加密连接,这意味着 Android P 将禁止 App 使用所有未加密的连接,因此运行 Android P 系统的安卓设备无论是接收或者发送流量,未来都不能明码传输,需要使用下一代(Transport Layer Security)传输层安全协议,而 Android Nougat 和 Oreo 则不受影响,因此在Android P 使用HttpUrlConnection进行http请求会出现以下异常java.net.UnknownServiceException: CLEARTEXT communication ** not permitted by network security policy在Android P系统的设备上,如果应用使用的是非加密的明文流量的http网络请求,则会导致该应用无法进行网络请求,https则不会受影响,同样地,如果应用嵌套了webview,webview也只能使用https请求。有人认为 Android P 上所有的 App 都需要使用 TLS 加密会降低上网体验,事实上这是一种误解,至于 App 对于少数旧服务器的连接如果非要使用明码传输,开发者需要更改 App 的网络安全配置以允许此类连接。


三种解决办法

APP改用https请求
targetSdkVersion 降到27以下

最终暴力解决

点击链接加入群聊【编程之美】

<think>好的,我现在需要解决用户遇到的“CleartextHTTP trafficto www.baidu.com notpermitted”问题。这个问题通常出现在Android应用尝试使用HTTP明文传输,而Android9及以上版本默认禁止这种行为。首先,我得确认用户是否了解网络安全性配置的相关内容。首先,用户可能没有配置网络安全策略,导致应用无法使用HTTP。根据Android官方文档,从Android9(API28)开始,默认禁止明文传输。解决方法之一是在res/xml目录下创建网络安全配置文件,允许特定的域名使用HTTP。接下来,我需要提供具体的代码示例,展示如何创建network_security_config.xml文件,并在AndroidManifest.xml中引用它。同时,用户可能还需要考虑是否允许所有域名或仅特定域名使用明文传输,这涉及到配置文件中的domain设置。另外,用户可能不知道如何在旧版本Android中处理此问题。针对targetSdkVersion低于28的情况,可以在AndroidManifest.xml中设置usesCleartextTraffic属性为true,但这不推荐,因为会降低安全性。 此外,用户可能希望某些特定域名使用HTTP,而其他域名使用HTTPS。这时候需要详细配置网络安全策略,包括添加多个domain元素,并设置cleartextTrafficPermitted为true。还需要考虑是否要信任用户自定义的证书或绕过证书验证,这在测试阶段可能会有用,但正式环境中应避免。这部分需要提供相应的代码示例,比如使用自定义的OkHttpClient来忽略SSL验证,但必须强调这仅用于测试。最后,用户可能对Android的网络安全性策略不太熟悉,因此需要解释每个步骤的作用,以及为什么这些配置能解决问题。同时,要提醒用户在生产环境中应优先使用HTTPS,确保数据传输的安全性。在回答中,我需要分步骤给出解决方案,每个方法都提供代码示例和解释,确保用户能够理解并正确实施。然后,根据用户的问题,提出一些相关问题,帮助他们进一步了解相关主题,比如如何强制使用HTTPS、处理SSL证书错误、网络配置的最佳实践以及使用HTTPS的库等。</think>### **解决方案** #### **问题分析** 当 Android 应用尝试发送 HTTP 明文请求时,若目标设备运行 Android 9(API 28)或更高版本,系统默认会阻止此类请求并抛出 `Cleartext HTTP traffic to ... not permitted` 错误。这是因为 Android 要求网络通信必须使用 HTTPS 以保障数据安全。 --- ### **方法 1:配置网络安全策略(推荐)** 在 `res/xml` 目录下创建 `network_security_config.xml`,允许特定域名使用 HTTP: ```xml <!-- res/xml/network_security_config.xml --> <network-security-config> <domain-config cleartextTrafficPermitted="true"> <!-- 允许所有 HTTP 请求(不推荐) --> <domain includeSubdomains="true">*</domain> <!-- 或仅允许特定域名(如 www.baidu.com) --> <domain includeSubdomains="true">www.baidu.com</domain> </domain-config> </network-security-config> ``` 在 `AndroidManifest.xml` 中引用此配置: ```xml <application android:networkSecurityConfig="@xml/network_security_config" ...> </application> ``` #### **解释** - `cleartextTrafficPermitted="true"`:允许明文流量。 - `domain`:指定允许的域名,`includeSubdomains` 控制是否包含子域名。 --- ### **方法 2:全局允许明文流量(仅限旧版 Android)** 如果 `targetSdkVersion < 28`,可以在 `AndroidManifest.xml` 中强制允许明文流量: ```xml <application android:usesCleartextTraffic="true" ...> </application> ``` #### **警告** - **不推荐**:此方法会允许所有 HTTP 请求,降低安全性。 - **仅限测试**:正式环境应始终使用 HTTPS。 --- ### **方法 3:仅允许特定域名(Android 9+)** 如果希望精细化控制,仅允许 `www.baidu.com` 使用 HTTP: ```xml <!-- network_security_config.xml --> <network-security-config> <domain-config cleartextTrafficPermitted="true"> <domain includeSubdomains="true">www.baidu.com</domain> </domain-config> <!-- 其他域名默认禁止 HTTP --> <base-config cleartextTrafficPermitted="false" /> </network-security-config> ``` --- ### **方法 4:使用 HTTPS 替代 HTTP** 最终解决方案是将请求升级为 HTTPS: ```java // 示例:使用 Retrofit 强制 HTTPS Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://www.baidu.com/") // 注意协议为 HTTPS .client(new OkHttpClient.Builder().build()) .build(); ``` #### **解释** - 百度等主流服务均已支持 HTTPS。 - 修改请求 URL 的协议为 `https://` 可避免此问题。 --- ### **错误原因总结** - **Android 9+ 默认禁止 HTTP**:系统强制使用 HTTPS。 - **未配置网络安全策略**:未在 `network_security_config.xml` 中允许明文流量。 - **旧版配置不兼容**:`targetSdkVersion ≥ 28` 时需显式声明允许的域名。 --- ###
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值