Search code examples
androidandroid-4.4-kitkat

Toggle mobile data programmatically on Android 4.4.2


I've always used this code to enable mobile data programmatically:

ConnectivityManager conman = (ConnectivityManager) context.getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
@SuppressWarnings("rawtypes")
final Class conmanClass = Class.forName(conman.getClass().getName());
final Field iConnectivityManagerField = conmanClass.getDeclaredField("mService");
iConnectivityManagerField.setAccessible(true);
final Object iConnectivityManager = iConnectivityManagerField.get(conman);
@SuppressWarnings("rawtypes")
final Class iConnectivityManagerClass = Class.forName(iConnectivityManager.getClass().getName());
@SuppressWarnings("unchecked")
final Method setMobileDataEnabledMethod = iConnectivityManagerClass.getDeclaredMethod("setMobileDataEnabled", Boolean.TYPE);
setMobileDataEnabledMethod.setAccessible(true);
setMobileDataEnabledMethod.invoke(iConnectivityManager, true);

This worked well, except now on Android 4.4.2 where I get this exception:

java.lang.NoSuchMethodException: setMobileDataEnabled [boolean]
    at  java.lang.Class.getConstructorOrMethod(Class.java:472)
    at java.lang.Class.getDeclaredMethod(Class.java:640)
    at com.test.auto3gPro.ClasseConnessione.settaConnessione(ClasseConnessione.java:48)
    at com.test.auto3gPro.receiver.ScreenBroadcastReceiver.onReceive(ScreenBroadcastReceiver.java:108)
    at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:768)
    at android.os.Handler.handleCallback(Handler.java:733)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:136)
    at android.app.ActivityThread.main(ActivityThread.java:5081)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:781)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
    at dalvik.system.NativeStart.main(Native Method)

Does anyone know how to fix this?


Solution

  • If you are using cyanogenmod the method setMobileDataEnabled(boolean) is changed in setMobileDataEnabled(String, boolean)...as you can see on this line of code.

    So you can use the standard way and then in the NoSuchMethodException catch block try the "cyanogenmod" way like this:

    Class[] cArg = new Class[2];
    cArg[0] = String.class;
    cArg[1] = Boolean.TYPE;
    Method setMobileDataEnabledMethod;
    
    setMobileDataEnabledMethod = iConnectivityManagerClass.getDeclaredMethod("setMobileDataEnabled", cArg);
    
    Object[] pArg = new Object[2];
    pArg[0] = getContext().getPackageName();
    pArg[1] = true;
    setMobileDataEnabledMethod.setAccessible(true);
    setMobileDataEnabledMethod.invoke(iConnectivityManager, pArg);
    

    I don't know if other mods are affected.