Деактивиране/Активиране на мобилни данни на Android L с root достъп

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

Потърсих известно време и намерих методите с отражение, които работеха до android 4.3. Също така видях метода от тази публикация Toggle мобилни данни програмно на 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();
    }
}

Моля, докладвайте, ако това има проблеми на някое устройство.

РЕДАКТИРАНЕ: Вече е съвместимо и с android 5.1 Кредит

person Slv3r    schedule 12.01.2015
comment
Не, на android 4.4 и по-стари можете да погледнете това - person Slv3r; 26.01.2015
comment
Също така съвместим с 5.1.1 Cyanogenmod - person Ben De La Haye; 12.09.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 "$@"

от su shell.

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