You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决小米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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:31:47