Android9.0以后不允许HTTP访问的解决方案

2024-03-31 09:12

本文主要是介绍Android9.0以后不允许HTTP访问的解决方案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

背景

自 Android 9.0 起,默认禁止使用 HTTP 进行访问。当尝试使用 HTTP 链接时,将会收到以下错误信息:

"Cleartext HTTP traffic to " + host + " not permitted"

为了解决这一问题,下面介绍两种破解方法:

XML布局设置

在 Android 9.0 及以上版本,需要通过以下配置允许 HTTP 访问。在 android/app/res 目录下新建 network_security_config.xml 文件,内容如下:

<network-security-config><base-config cleartextTrafficPermitted="true"><trust-anchors><certificates src="system" /></trust-anchors></base-config>
</network-security-config>

然后在 android/app 目录下的 AndroidManifest.xml 文件中的 application 标签内声明文件:

android:usesCleartextTraffic="true"
android:networkSecurityConfig="@xml/network_security_config"

其实只需在 AndroidManifest.xml 文件中的 application 标签内声明 android:usesCleartextTraffic="true" 就可以了。如果还有特殊的配置,则需要配置 networkSecurityConfig 文件。另外需要说明的是,networkSecurityConfig 文件中的 cleartextTrafficPermitted 属性会优先于 application 标签内的 usesCleartextTraffic,这意味着,即使在 application 标签中设置了 android:usesCleartextTraffic="false",但在 networkSecurityConfig 文件中设置了 cleartextTrafficPermitted="true",仍然会开启明文传输。

代码设置

为了验证结果,首先需要在 AndroidManifest.xml 文件中的 application 标签内声明文件:

android:usesCleartextTraffic="false"

接下来编写反射工具类,用于调用对象的指定方法:

import android.util.Log;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;/*** 反射工具类,用于调用对象的指定方法*/
public class ReflectionUtil {private static final String TAG = "ReflectionUtil"; // 日志标签/*** 调用对象的指定方法* * @param owner      方法所属的对象实例* @param methodName 方法名* @param b          方法参数,boolean类型* @return 方法的返回值,如果调用失败则返回null*/public static Object invokeMethod(Object owner, String methodName, boolean b) {if (owner == null) {Log.e(TAG, methodName + " not invoked, owner is null"); // 记录错误日志:对象为空无法调用方法return null;}try {Class<?> ownerClass = owner.getClass(); // 获取对象的类Method method = ownerClass.getDeclaredMethod(methodName, boolean.class); // 获取指定方法method.setAccessible(true); // 设置方法为可访问return method.invoke(owner, b); // 调用方法} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {Log.e(TAG, methodName +" not invoked, InvocationTargetException or NoSuchFieldException or IllegalAccessException: " +e.getMessage()); // 记录错误日志:方法调用失败}return null;}
}

最后,通过以下代码设置:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {boolean permittedOld = NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted(); // 获取旧的 cleartext 流量是否允许Log.i("TAG", "onCreate, permittedOld: " + permittedOld); // 记录旧的 cleartext 流量是否允许的日志// 动态设置 setCleartextTrafficPermitted 方法ReflectionUtil.invokeMethod(NetworkSecurityPolicy.getInstance(), "setCleartextTrafficPermitted", true);boolean permittedNew = NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted(); // 获取新的 cleartext 流量是否允许Log.i("TAG", "onCreate, permittedNew: " + permittedNew); // 记录新的 cleartext 流量是否允许的日志
}

简而言之,通过 XML 布局和反射设置,可以绕过 Android 9.0 的 HTTP 访问限制。

这篇关于Android9.0以后不允许HTTP访问的解决方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/863975

相关文章

usb接口驱动异常问题常用解决方案

《usb接口驱动异常问题常用解决方案》当遇到USB接口驱动异常时,可以通过多种方法来解决,其中主要就包括重装USB控制器、禁用USB选择性暂停设置、更新或安装新的主板驱动等... usb接口驱动异常怎么办,USB接口驱动异常是常见问题,通常由驱动损坏、系统更新冲突、硬件故障或电源管理设置导致。以下是常用解决

Windows Docker端口占用错误及解决方案总结

《WindowsDocker端口占用错误及解决方案总结》在Windows环境下使用Docker容器时,端口占用错误是开发和运维中常见且棘手的问题,本文将深入剖析该问题的成因,介绍如何通过查看端口分配... 目录引言Windows docker 端口占用错误及解决方案汇总端口冲突形成原因解析诊断当前端口情况解

Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案

《Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案》:本文主要介绍Vue3组件中getCurrentInstance()获取App实例,但是返回nu... 目录vue3组件中getCurrentInstajavascriptnce()获取App实例,但是返回n

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三

Node.js 数据库 CRUD 项目示例详解(完美解决方案)

《Node.js数据库CRUD项目示例详解(完美解决方案)》:本文主要介绍Node.js数据库CRUD项目示例详解(完美解决方案),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考... 目录项目结构1. 初始化项目2. 配置数据库连接 (config/db.js)3. 创建模型 (models/

Vuex Actions多参数传递的解决方案

《VuexActions多参数传递的解决方案》在Vuex中,actions的设计默认只支持单个参数传递,这有时会限制我们的使用场景,下面我将详细介绍几种处理多参数传递的解决方案,从基础到高级,... 目录一、对象封装法(推荐)二、参数解构法三、柯里化函数法四、Payload 工厂函数五、TypeScript

jupyter代码块没有运行图标的解决方案

《jupyter代码块没有运行图标的解决方案》:本文主要介绍jupyter代码块没有运行图标的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录jupyter代码块没有运行图标的解决1.找到Jupyter notebook的系统配置文件2.这时候一般会搜索到

Nginx中配置HTTP/2协议的详细指南

《Nginx中配置HTTP/2协议的详细指南》HTTP/2是HTTP协议的下一代版本,旨在提高性能、减少延迟并优化现代网络环境中的通信效率,本文将为大家介绍Nginx配置HTTP/2协议想详细步骤,需... 目录一、HTTP/2 协议概述1.HTTP/22. HTTP/2 的核心特性3. HTTP/2 的优

使用Python自建轻量级的HTTP调试工具

《使用Python自建轻量级的HTTP调试工具》这篇文章主要为大家详细介绍了如何使用Python自建一个轻量级的HTTP调试工具,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下... 目录一、为什么需要自建工具二、核心功能设计三、技术选型四、分步实现五、进阶优化技巧六、使用示例七、性能对比八、扩展方向建

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.