Отключить/Включить мобильные данные на Android L с правами доступа root
Я пишу небольшое приложение, которое только я буду использовать, и я хочу прагматично включить/отключить свои мобильные данные на корневом устройстве Android 4.5 (я запускаю пользовательский Android L для Nexus 4).
Я искал какое-то время, и я нашел методы с отражением, которые работали до Android 4.3.
Я также видел метод из этого сообщения Программный перевод мобильных данных на Android 4.4.2, но для этого требуется cyanogenmod.
Из того, что я могу найти в Интернете, это невозможно для приложений без полномочий root, но мой вопрос:
есть ли что-то, что я могу сделать с моими привилегиями root, чтобы выполнить это?
Ответы
Ответ 1
Я создал этот метод, оглядываясь по интернету; он отлично работает на корневом 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();
}
}
Сообщайте, есть ли проблемы на каком-либо устройстве.
EDIT: теперь также совместим с android 5.1 Кредит
Ответ 2
Используйте этот
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 "[email protected]"
из su shell.
Ответ 3
Я заметил, что метод вызова службы не работает последовательно на всех устройствах. Номер, который будет использоваться в нем, варьируется от устройства к устройству.
Я нашел следующее решение, которое работает без каких-либо проблем во всех устройствах ROOTED.
Просто выполните следующее через su
Чтобы включить мобильные данные
svc data enable
Чтобы отключить мобильные данные
svc data disable
Это так просто.
Ответ 4
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);
}
}