2

嗨,我已经阅读了很多关于这个论点的内容,但我认为如何在 android 5+ 中更改首选网络存在很多错误。
首先,我的应用程序可以使用root,但作为必要条件,它必须留在 play store 中

为此,我认为有三种方法:

  1. 有根
  2. 使用系统应用程序证书签署您的应用程序
  3. 使用运营商许可签署您的应用

对于第二种方法,存在一些大问题:

  • 您不能在 Play 商店中发布使用系统证书签名的应用
  • 某些设备(例如华为)不能安装具有系统证书的应用程序

对于第三种方法,问题是沃达丰不是我的朋友:)

那么,让我们谈谈第一种方法:

在 Play 商店里面有很多应用程序可以通过 root 权限更改首选网络,例如 Automate:https: //play.google.com/store/apps/details? id=com.llamalab.automate.ext.superuser &hl =它
我认为所有应用程序调用都在根会话中通过内部API反射这个函数:https ://github.com/android/platform_frameworks_base/blob/nougat-mr1-release/telephony/java/com/android/internal/telephony/ ITelephony.aidl#L753
所以我尝试用这段代码来做这件事......但冻结我的应用程序:

/**
 * Function that change the preffered network
 * @param Context context - The context of application
 * @param String state_network - State that you want change ["2G" "3G" "4G" "2G/3G" "2G/3G/4G"]
 * @return boolean
 */
public static String setDeviceNetwork(Context context, String state_network){
    try {
        Process process = null;
        process = Runtime.getRuntime().exec("su");
        process.waitFor();
        TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);

        try{
            Class<?> forName = Class.forName("com.android.internal.telephony.PhoneFactory");
            try {
                Method getDefaultPhone = forName.getMethod("getDefaultPhone", new Class[]{});
                getDefaultPhone.setAccessible(true);
                try {
                    Object mPhone = getDefaultPhone.invoke(null, new Object[]{}); //@TODO qui!
                    Method setPreferredNetworkType = mPhone.getClass().getMethod("setPreferredNetworkType", new Class[]{int.class, Message.class});
                    Method getPreferredNetworkType = mPhone.getClass().getMethod("getPreferredNetworkType", new Class[]{Message.class});
                    setPreferredNetworkType.setAccessible(true);
                    setPreferredNetworkType.invoke(mPhone, new Object[]{1, "1"});
                    return "WORK!";
                }catch (IllegalAccessException e){
                    return "Error IllegalAccessException on run command change network";
                }catch (InvocationTargetException e){
                    return "Error InvocationTargetException on run command change network";
                }
            }catch (NoSuchMethodException e){
                return "Error NoSuchMethodException on find method";
            }
        }catch (ClassNotFoundException e){
            return "Error ClassNotFoundException on find class";
        }
    } catch (IOException e) {
        e.printStackTrace();
        return "Error IOException on sudo command";
    }
    catch (InterruptedException e) {
        e.printStackTrace();
        return "Error InterruptException on sudo command";
    }
}

关于这个问题的任何解决方案?

4

0 回答 0