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

如何通过编程强制Android手机仅使用2G/3G网络(适配Android 5+)

Android 5+ 编程修改首选网络模式为仅3G/2G的方案

核心限制说明

从Android 5.0(API 21)开始,普通第三方应用无法直接修改首选网络模式——该操作需要android.permission.MODIFY_PHONE_STATE权限,而从API 23起,这个权限被标记为signature|privileged级别,仅系统签名应用或安装在系统分区的特权应用才能获取。

可行方案分类

1. 系统签名/特权应用方案

如果你的应用能获取系统签名或被部署为特权应用,可通过反射调用TelephonyManager的隐藏API实现修改:

权限声明

首先在AndroidManifest.xml中添加权限:

<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />

代码实现(适配Android 5-10)

import android.content.Context;
import android.telephony.TelephonyManager;
import java.lang.reflect.Method;

public class NetworkController {
    // 通用仅3G网络模式常量(部分厂商可能有差异,需适配)
    private static final int NETWORK_TYPE_WCDMA_ONLY = 8;
    // 通用仅2G网络模式常量
    private static final int NETWORK_TYPE_GSM_ONLY = 1;

    public static boolean setOnly3G(Context context) {
        TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        return setPreferredNetworkType(tm, NETWORK_TYPE_WCDMA_ONLY);
    }

    public static boolean setOnly2G(Context context) {
        TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        return setPreferredNetworkType(tm, NETWORK_TYPE_GSM_ONLY);
    }

    private static boolean setPreferredNetworkType(TelephonyManager tm, int networkType) {
        try {
            // 尝试调用公开隐藏方法
            Method method = TelephonyManager.class.getMethod("setPreferredNetworkType", int.class);
            method.invoke(tm, networkType);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            // 适配部分厂商的内部方法名
            try {
                Method internalMethod = TelephonyManager.class.getMethod("setPreferredNetworkTypeInternal", int.class);
                internalMethod.invoke(tm, networkType);
                return true;
            } catch (Exception ex) {
                ex.printStackTrace();
                return false;
            }
        }
    }
}
注意事项
  • 不同厂商的网络模式常量可能不同(比如部分华为机型仅3G的常量为10),需针对目标设备做适配。
  • Android 11及以上,需先通过TelephonyManager.createForSubscriptionId()获取对应SIM卡的实例,再执行反射操作。

2. 普通第三方应用替代方案

若无法获取系统权限,只能通过间接方式实现需求:

  • 引导用户手动修改:通过Intent跳转至系统移动网络设置页面,让用户手动选择网络模式:
    Intent intent = new Intent("android.settings.NETWORK_OPERATOR_SETTINGS");
    context.startActivity(intent);
    
  • ADB调试场景:在有权限的电脑上通过ADB命令修改(仅适用于开发测试):
    # 跳转至移动网络设置页
    adb shell am start -a android.intent.action.MAIN -n com.android.settings/.Settings\$MobileNetworkSettings
    # 直接设置仅3G(部分设备支持,常量需根据设备调整)
    adb shell service call phone 83 i32 8
    

关键提示

普通第三方应用无法绕过系统权限限制直接修改网络模式,这是Android系统安全机制的强制要求。只有获得系统签名或特权应用身份,才能实现程序化修改。

内容的提问来源于stack exchange,提问作者zeeshan kamboh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 01:25:27