Отключить/включить мобильные данные на Android L с корневым доступом

Я пишу небольшое приложение, которое буду использовать только я, и я хочу прагматично включать/отключать свои мобильные данные на корневом устройстве Android 4.5 (я использую собственный Android L для Nexus 4).

Я некоторое время искал и нашел методы с отражением, которые работали до Android 4.3. Я также видел метод из этого сообщения мобильные данные программно на Android 4.4.2, но для этого требуется cyanogenmod.

Из того, что я могу найти в Интернете, это невозможно для приложений без полномочий root, но мой вопрос:

Могу ли я что-нибудь сделать с моими привилегиями root, чтобы добиться этого?


person Nactive    schedule 23.08.2014    source источник
comment
Я ищу то же самое. Пожалуйста, обновите свой ответ, если найдете решение. setMobileDataEnabled все еще присутствует в Android L, если вы просматриваете методы в исходном коде ConnectivityManager, но когда вы ищете его через отражение, кажется, что его нет. Я также в порядке с использованием привилегий root для достижения этого, но не знаю, как это сделать.   -  person Flyview    schedule 25.09.2014
comment
в Android L, если вы нажмете device_owner.xml, тогда у вас будет право доступа для включения и отключения API, предоставленного в Android L   -  person KOTIOS    schedule 09.10.2014
comment
@Nactive Если вы найдете мой ответ правильным, не могли бы вы его проверить? Если нет, не могли бы вы объяснить, почему? Спасибо!   -  person Slv3r    schedule 15.04.2015


Ответы (3)


Я создал этот метод, просматривая Интернет; он отлично работает на root 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 android-l-and-later/28683889#28683889">Кредит

person Slv3r    schedule 12.01.2015

Использовать это

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 "$@"

из су оболочки.

person nandeesh    schedule 13.10.2014
comment
Вы тестировали это в Android L? Нет смысла устанавливать метод НЕ доступным, а затем вызывать его. - person Flyview; 14.10.2014
comment
Для этого требуется разрешение MODIFY_PHONE_STATE, которое предоставляется только системным приложениям. Есть ли способ предоставить это с правами root? - person Flyview; 18.10.2014
comment
если у вас есть root-доступ, переместите свое приложение в system/app , ваше приложение станет системным приложением. - person nandeesh; 20.10.2014
comment
Это что-то, что приложение может делать автоматически? Я не хочу, чтобы мои пользователи делали это вручную. - person Flyview; 21.10.2014
comment
@nandeesh: Простое перемещение вашего приложения в каталог /system/app не делает ваше приложение волшебным образом системным. Вам по-прежнему необходимо подписать свое приложение с помощью сертификата платформы Android, а также настроить AndroidManifest.xml с соответствующими директивами, чтобы приложение работало как системное приложение. Я сомневался, что ваш ответ выше вообще сработает, не говоря уже о получении 25 репутации от награды. - person ChuongPham; 23.11.2014
comment
@ChuongPham: Этот ответ неполный — в нем необходимо уточнить, как приложение должно быть подписано с помощью сертификата платформы Android, AndroidManifest.xml конфигураций и т. д. Простое размещение приложения в каталоге /system/app/ на устройстве * *не делать его системным приложением. - person ; 23.11.2014
comment
@ChuongPham Вы вообще знаете, как подписывать, потому что для подписания приложения вам не нужно изменять AndroidManifest.xml, а подписание не является условием для системного приложения, существует множество системных приложений, например, приложения оператора связи, приложения Google, которые не подписаны платформой, но это системное приложение. - person nandeesh; 23.11.2014
comment
@nandeesh: я бы посоветовал вам сначала изучить вопрос, прежде чем публиковать дикий комментарий, поскольку он показывает, что вы не понимаете фундаментальных основ, касающихся системных приложений, приложений для операторов связи и т. д., а также того, как они работают в рамках модели безопасности Android. - person ChuongPham; 23.11.2014

Я заметил, что метод вызова службы не работает стабильно на всех устройствах. Число, которое будет использоваться в нем, варьировалось от устройства к устройству.

Я нашел следующее решение, которое без проблем работает на всех ROOTED-устройствах.

Просто выполните следующее через su

Чтобы включить мобильные данные

svc data enable

Чтобы отключить мобильные данные

svc data disable

Это так просто.

person A.J.    schedule 03.04.2015