如何解决小米Redmi3S(Android6.0.1)明文流量与支付网关兼容问题?
解决方案:API23下兼顾支付网关与明文域名访问
针对你遇到的API23(Android 6.0)设备无法使用networkSecurityConfig、全局cleartextTrafficPermitted=true与支付网关冲突,且仅小米Redmi 3S出现问题的情况,提供以下可行方案:
一、核心思路
API23不支持networkSecurityConfig,我们需要在全局关闭明文访问(满足支付网关要求)的同时,通过反射替换系统网络安全策略,仅对目标域名放开明文访问权限,既不违反支付网关规则,又能解决特定设备的明文访问限制。
二、具体实现步骤
1. 保持全局明文访问关闭
在AndroidManifest.xml的application标签中继续保留支付网关要求的配置:
<application ... android:cleartextTrafficPermitted="false" ...>
2. 自定义网络安全策略类
创建一个继承自NetworkSecurityPolicy的子类,针对需要明文访问的域名单独放行:
import android.security.NetworkSecurityPolicy; public class CustomNetworkSecurityPolicy extends NetworkSecurityPolicy { // 替换成你需要明文访问的目标域名 private static final String ALLOWED_DOMAIN = "your-target-domain.com"; private final NetworkSecurityPolicy originalPolicy; public CustomNetworkSecurityPolicy(NetworkSecurityPolicy original) { this.originalPolicy = original; } // 保持全局明文访问关闭,满足支付网关要求 @Override public boolean isCleartextTrafficPermitted() { return originalPolicy.isCleartextTrafficPermitted(); } // 仅对目标域名放开明文访问权限 @Override public boolean isCleartextTrafficPermitted(String host) { if (ALLOWED_DOMAIN.equals(host)) { return true; } return originalPolicy.isCleartextTrafficPermitted(host); } }
3. 在Application中替换系统策略
通过反射将系统默认的NetworkSecurityPolicy实例替换为我们自定义的,仅在API23设备上执行该逻辑:
import android.os.Build; import android.security.NetworkSecurityPolicy; import android.app.Application; import java.lang.reflect.Field; public class MyApp extends Application { @Override public void onCreate() { super.onCreate(); // 仅针对API23(Android 6.0)设备处理 if (Build.VERSION.SDK_INT == Build.VERSION_CODES.M) { try { // 获取系统策略的单例字段并设置可访问 Field instanceField = NetworkSecurityPolicy.class.getDeclaredField("sInstance"); instanceField.setAccessible(true); // 获取原始策略实例 NetworkSecurityPolicy originalPolicy = NetworkSecurityPolicy.getInstance(); // 创建自定义策略并替换系统实例 CustomNetworkSecurityPolicy customPolicy = new CustomNetworkSecurityPolicy(originalPolicy); instanceField.set(null, customPolicy); } catch (Exception e) { e.printStackTrace(); // 反射失败时可添加日志上报或降级提示逻辑 } } } }
三、针对小米MIUI设备的额外处理
由于问题仅出现在Redmi 3S的MIUI 10.2上,可能是MIUI定制的额外安全限制导致,可尝试以下操作:
- 打开手机安全中心 → 应用权限管理 → 查找当前应用,检查是否有「禁止明文网络访问」的选项,将其关闭
- 如果反射方案仍失效,可在OkHttp中添加日志拦截器,确认请求是否被MIUI拦截,再针对性调整
四、注意事项
- 反射操作可能因ROM定制或系统更新失效,需做好异常捕获和 fallback 方案
- 若目标域名支持HTTPS,优先使用HTTPS访问更安全,避免依赖明文访问
内容的提问来源于stack exchange,提问作者Rahul Khatri
相关产品推荐
相关产品推荐

