在具有root访问权限的Android L上禁用/启用移动数据

时间:2014-08-23 21:05:43

标签: android android-5.0-lollipop

我正在编写一个小应用程序,只有我会使用,我想在root的android 4.5设备上实际启用/禁用我的移动数据(我正在为Nexus 4运行自定义Android L)。

我已经看了一会儿,我发现反射的方法一直有效,直到android 4.3。 我也看过这篇文章Toggle mobile data programmatically on Android 4.4.2中的方法,但这需要cyanogenmod。

从我在互联网上可以找到的内容来看,这对于非root应用来说是不可能的,但我的问题是:

我能用权限完成此操作吗

4 个答案:

答案 0 :(得分:10)

我在互联网上创造了这种方法;它在 rooted android 5.0.1上运行正常 基本上,如果要启用连接,则必须传递true,否则返回false,以及应用程序的上下文。

private final static String COMMAND_L_ON = "svc data enable\n ";
private final static String COMMAND_L_OFF = "svc data disable\n ";
private final static String COMMAND_SU = "su";

public static void setConnection(boolean enable,Context context){

    String command;
    if(enable)
        command = COMMAND_L_ON;
    else
        command = COMMAND_L_OFF;        

    try{
        Process su = Runtime.getRuntime().exec(COMMAND_SU);
        DataOutputStream outputStream = new DataOutputStream(su.getOutputStream());

        outputStream.writeBytes(command);
        outputStream.flush();

        outputStream.writeBytes("exit\n");
        outputStream.flush();
        try {
            su.waitFor();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        outputStream.close();
    }catch(IOException e){
        e.printStackTrace();
    }
}

如果某些设备出现问题,请报告。

编辑:现在还兼容Android 5.1 Credit

答案 1 :(得分:3)

使用此

TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
Method methodSet = tm.class.getDeclaredMethod( "setDataEnabled", boolean.class);
methodSet.invoke(tm, true); 

编辑: 这需要权限MODIFY_PHONE_STATE,这是系统或签名级别权​​限。

理想情况下,您可以使用此代码创建一个可运行的jar文件,并使用

执行它
export CLASSPATH=<jar path>
exec app_process <jar-dir-path> your.package.name.classname "$@"
来自su shell的

答案 2 :(得分:3)

我注意到服务调用方法在所有设备上都不能一致地工作。其中使用的数量因设备而异。

我发现以下解决方案在所有ROOTED设备上都没有任何问题。

只需通过 su

执行以下操作即可

启用移动数据

svc data enable

禁用移动数据

svc data disable

就这么简单。

答案 3 :(得分:0)

void turnData(boolean ON) throws Exception
{

    int currentapiVersion = android.os.Build.VERSION.SDK_INT;
    if(currentapiVersion == Build.VERSION_CODES.FROYO)
    {

        Log.i("version:", "Found Froyo");
        try{ 
            Method dataConnSwitchmethod;
            Class telephonyManagerClass;
            Object ITelephonyStub;
            Class ITelephonyClass;
            TelephonyManager telephonyManager = (TelephonyManager) cx.getApplicationContext().getSystemService(Context.TELEPHONY_SERVICE);

            telephonyManagerClass = Class.forName(telephonyManager.getClass().getName());
        Method getITelephonyMethod = telephonyManagerClass.getDeclaredMethod("getITelephony");
        getITelephonyMethod.setAccessible(true);
        ITelephonyStub = getITelephonyMethod.invoke(telephonyManager);
        ITelephonyClass = Class.forName(ITelephonyStub.getClass().getName());

        if (ON) {
             dataConnSwitchmethod = ITelephonyClass.getDeclaredMethod("enableDataConnectivity"); 

        } else {
            dataConnSwitchmethod = ITelephonyClass.getDeclaredMethod("disableDataConnectivity");
        }
        dataConnSwitchmethod.setAccessible(true);
        dataConnSwitchmethod.invoke(ITelephonyStub);
        }catch(Exception e){
              Log.e("Error:",e.toString());
        }

    }
     else
    {
       Log.i("version:", "Found Gingerbread+");
       final ConnectivityManager conman = (ConnectivityManager) cx.getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
       final Class conmanClass = Class.forName(conman.getClass().getName());
       final Field iConnectivityManagerField = conmanClass.getDeclaredField("mService");
       iConnectivityManagerField.setAccessible(true);
       final Object iConnectivityManager = iConnectivityManagerField.get(conman);
       final Class iConnectivityManagerClass =  Class.forName(iConnectivityManager.getClass().getName());
       final Method setMobileDataEnabledMethod = iConnectivityManagerClass.getDeclaredMethod("setMobileDataEnabled", Boolean.TYPE);
       setMobileDataEnabledMethod.setAccessible(true);
       setMobileDataEnabledMethod.invoke(iConnectivityManager, ON);
    }
}