Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了android – 如何从3G和2G / EDGE切换反之亦然?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图通过代码将网络偏好从3G切换到2G / EDGE,反之亦然.我可以打开和关闭移动数据连接.现在我需要知道如何通过代码在3G到2G / EDGE之间切换,反之亦然.有人可以帮我吗提前致谢.

解决方法

我偶然发现了一种用反射和系统调用命令来解决这个问题的方法,并决定报告它,即使线程已经过时并且有一些警告:

>需要根
> Hackish并且可能特定于ROM(在CM 12.1 titan上测试)
>可能不适用于所有Android版本(在5.1.1上测试)

大部分代码都是从this answer by ChuongPham借来的.

首先,我们需要通过获取ITelephony类的声明字段的值获取正确的事务代码.由于我怀疑字段的名称可能会略有不同,具体取决于平台(对于我的字段名称是“transaCTION_setPreferredNetworkType_96”),我提供了尽可能灵活的解决方案:

private static String get3gtransactionCode(Context context) throws ClassnotFoundException,NoSuchMethodException,InvocationTargetException,illegalaccessexception,NoSuchFieldException {
    final Telephonymanager mTelephonymanager = (Telephonymanager) context.getSystemservice(Context.TELEPHONY_serviCE);
    final Class<?> mTelephonyClass = Class.forName(mTelephonymanager.getClass().getName());
    final Method mTelephonymethod = mTelephonyClass.getDeclaredMethod("getITelephony");
    mTelephonymethod.setAccessible(true);
    final Object mTelephonystub = mTelephonymethod.invoke(mTelephonymanager);
    final Class<?> mTelephonystubClass = Class.forName(mTelephonystub.getClass().getName());
    final Class<?> mClass = mTelephonystubClass.getDeclaringClass();
    for (Field f:mClass.getDeclaredFields()) {
        if (f.getName().contains("setPreferredNetworkType")) {
            final Field field = mClass.getDeclaredField(f.getName());
            field.setAccessible(true);
            return String.valueOf(field.geTint(null));
        }
    }
    throw new NoSuchFieldException();
}

接下来我们可以通过su在系统调用中使用事务代码

private static void setPreferredNetworkType(Context context,int preferredTypE) throws ClassnotFoundException,NoSuchFieldException,InvocationTargetException {
    String transactionCode = get3gtransactionCode(context);
    String command = "service call phone " + transactionCode + " i32 " + preferredType;
    executeCommandViaSu(context,"-c",command);
}

在我的情况下,我将该方法称为2G的第二个参数为1,3G首选项为10.不同网络类型的常量可以在here找到.

为了方便和完整,我还从ChuongPham’s answer复制粘贴executeCommandViaSu方法

private static void executeCommandViaSu(Context context,String option,String command) {
    Boolean success = false;
    String su = "su";
    for (int i=0; i < 3; i++) {
        // Default "su" command executed successfully,then quit.
        if (success) {
            break;
        }
        // Else,execute other "su" commands.
        if (i == 1) {
            su = "/system/xbin/su";
        } else if (i == 2) {
            su = "/system/bin/su";
        }
        try {
            // Execute command as "su".
            Runtime.getRuntime().exec(new String[]{su,option,commanD});
        } catch (IOException E) {
            success = false;
            // Oops! CAnnot execute `su` for some reason.
            // Log error here.
        } finally {
            success = true;
        }
    }
}

大佬总结

以上是大佬教程为你收集整理的android – 如何从3G和2G / EDGE切换反之亦然?全部内容,希望文章能够帮你解决android – 如何从3G和2G / EDGE切换反之亦然?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。