以编程方式启用/禁用数据移动 - 无根

时间:2015-07-17 16:10:24

标签: android

我试图在特定时刻enable/disable移动数据。我已经在MotoG 4.4.2 (Rooted)上尝试了它,我没有问题,但是当我在Samsung Galaxy Grand Prime 4.4.4 (No Root)上尝试它时,它不起作用,我也是&#39已经在Samsung Galaxy S3 4.3 (No Root)上尝试了它,但它确实有效。

  1. MotoG工作 - 为什么? - ROOT Acces
  2. 三星Galaxy Grand Prime没有工作 - 为什么? - 我认为它不起作用,因为当我尝试手动操作时我不接受我希望丢失数据连接的对话框,我认为这是问题所在,因为它无法正常工作。
  3. 三星Galaxy S3工作 - 为什么? - 我认为这很有效,因为用户不会再向我展示"并且用户之前接受了它。
  4. 我尝试的代码是:

    public void GetDataConnectionAPI() {
        this.context.getApplicationContext();
        TelephonyManager telephonyManager =
                (TelephonyManager) this.context.getApplicationContext().
                        getSystemService(Context.TELEPHONY_SERVICE);
        try {
            telephonyManagerClass = Class.forName(telephonyManager.getClass().getName());
            Method getITelephonyMethod = telephonyManagerClass.getDeclaredMethod("getITelephony");
            getITelephonyMethod.setAccessible(true);
            ITelephonyStub = getITelephonyMethod.invoke(telephonyManager);
            ITelephonyClass = Class.forName(ITelephonyStub.getClass().getName());
    
            dataConnSwitchmethod_OFF =
                    ITelephonyClass.getDeclaredMethod("disableDataConnectivity");
            dataConnSwitchmethod_ON = ITelephonyClass.getDeclaredMethod("enableDataConnectivity");
        } catch (Exception e) { 
            e.printStackTrace();
        }
    }
    

    然后我用这种方法启用/禁用数据:

    public void setMobileDataEnabled(Context context, boolean enabled) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
        final ConnectivityManager conman = (ConnectivityManager)  context.getSystemService(Context.CONNECTIVITY_SERVICE);
        final Class conmanClass = Class.forName(conman.getClass().getName());
        final Field connectivityManagerField = conmanClass.getDeclaredField("mService");
        connectivityManagerField.setAccessible(true);
        final Object connectivityManager = connectivityManagerField.get(conman);
        final Class connectivityManagerClass =  Class.forName(connectivityManager.getClass().getName());
        final Method setMobileDataEnabledMethod = connectivityManagerClass.getDeclaredMethod("setMobileDataEnabled", Boolean.TYPE);
        setMobileDataEnabledMethod.setAccessible(true);
    
        setMobileDataEnabledMethod.invoke(connectivityManager, enabled);
    
    }
    

    当我想启用时,我调用此方法:

    public void EnableMobileData(){
        try {
            setMobileDataEnabled(context, true);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }
    

    在我的清单上,我把

    <!-- 3g uses-permisions-->
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
    

    我想知道是否有可能避免这种对话或只是以编程方式接受它。

    我已经阅读了Bojan Kogoj answer这就是我所说的:

      
        
    • 预先安装到ROM上的系统文件夹中
    •   
    • 由制造商使用其安全证书编制
    •   

    但我想知道是否有其他办法可以做到这一点。

1 个答案:

答案 0 :(得分:3)

MODIFY_PHONE_STATE权限不保证在所有情况下均可使用。默认情况下,它是系统级权限,因此它仅适用于制造商已启用它的设备。

类似地,像getITelephony()这样的方法是特定于设备/制造商的,并且无法在每个设备上获取这样做的方法的名称。

不幸的是,没有保证可以做到这一点。