Мобильные сети (Mobile data)

Ответить
LexusAVG
Сообщения: 13
Зарегистрирован: 18 дек 2015, 22:57

Мобильные сети (Mobile data)

Сообщение LexusAVG » 18 дек 2015, 23:21

Подскажите плиз решить две задачи:
1. Как проверить параметр Мобильные сети (Mobile data)? Интересует передача данных включена или нет, именно интересует какое состояние установлено в настройках
Screenshot_2015-12-18-22-10-10.png
Screenshot_2015-12-18-22-10-10.png (4.4 КБ) 4160 просмотров
2. Как изменить параметр Мобильные сети (Mobile data)? Т.е. изменить его состояние с вкл. на выкл. и наоборот.

Для API 17 и выше.

LexusAVG
Сообщения: 13
Зарегистрирован: 18 дек 2015, 22:57

Re: Мобильные сети (Mobile data)

Сообщение LexusAVG » 21 дек 2015, 09:29

А что, никто не знает как данную задачу решить :) Гуру андроида отзовитесь, подскажите плиз.

LexusAVG
Сообщения: 13
Зарегистрирован: 18 дек 2015, 22:57

Re: Мобильные сети (Mobile data)

Сообщение LexusAVG » 22 дек 2015, 16:18

На первый вопрос "Как проверить параметр Мобильные сети (Mobile data)" я уже нашел ответ:

Код: Выделить всё

private boolean GetMobileDataEnable() {
    boolean mobileDataEnabled = false;
    ConnectivityManager cm = (ConnectivityManager) this.getSystemService(CONNECTIVITY_SERVICE);
    try {
        Class cmClass = Class.forName(cm.getClass().getName());
        Method method = cmClass.getDeclaredMethod("getMobileDataEnabled");
        //Make the method callable
        method.setAccessible(true);
        // Get the setting for "mobile data"
        mobileDataEnabled = (Boolean)method.invoke(cm);
    }
    catch (Exception e) {
    }
    return mobileDataEnabled;
}
В AndroidManifest должно быть добавлено разрешение
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

А вот на второй вопрос частично. API 17 все работает, а вот на API 21 не работает.
Разочарован я в этих Андроидах, система не стандартизирована и из-за это-го усложняется написание кода. Я так понимаю что на API 21 провели изменения и без рут доступа выполнить второй пункт невозможно.
Гуру специалисты, неужели некто не знает ответа на второй вопрос?
Последний раз редактировалось LexusAVG 24 дек 2015, 12:04, всего редактировалось 1 раз.

LexusAVG
Сообщения: 13
Зарегистрирован: 18 дек 2015, 22:57

Re: Мобильные сети (Mobile data)

Сообщение LexusAVG » 24 дек 2015, 12:02

Ну видимо профи тут нет, но вдруг кому понадобится решить аналогичную задачу тогда вот:

Код: Выделить всё

    //Установить состояние мобильных данных
    private void SetMobileDataEnabled(boolean mobileDataEnabled)
    {
        //if VERSION SDK >= API 21
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            try
            {
                //Создаем объект класса TelephonyManager для доступа к данным телефона с параметром TELEPHONY_SERVICE
                TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
                //Получаем объект Method не зависимо от типа доступа для класса TelephonyManager по имени метода setDataEnabled и его типу
                Method method = tm.getClass().getDeclaredMethod("setDataEnabled", boolean.class);
                //Для получения доступа к методу setDataEnabled вызываем метод setAccessible у объекта Method с флагом true
                method.setAccessible(true);
                //Вызываем метод invoke() объекта Method и передаем два параметра:
                // 1 - это объект, класс которого объявляет или наследует данный метод (TelephonyManager)
                // 2 - массив значений параметров, которые передаются вызываемому методу, в нашем случае это значение переменной boolean
                method.invoke(tm, mobileDataEnabled);
            }
            catch (Exception e)
            {
            }
        }
        //API < 21
        else {
            try {
                //Создаем объект класса ConnectivityManager для доступа к мобильным данным с параметром CONNECTIVITY_SERVICE
                ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
                //Получаем объект Field не зависимо от типа доступа для класса ConnectivityManager по имени поля mService
                Field field = cm.getClass().getDeclaredField("mService");
                //Для получения доступа к полю mService вызываем метод setAccessible у объекта Field с флагом true
                field.setAccessible(true);
                //Получаем значение поля mService с сылкой на объект класса ConnectivityManager
                Object object = field.get(cm);
                //Получаем объект Method не зависимо от типа доступа для класса object по имени метода setMobileDataEnabled и его типу
                Method method = object.getClass().getDeclaredMethod("setMobileDataEnabled", Boolean.TYPE);
                //Для получения доступа к методу setDataEnabled вызываем метод setAccessible у объекта Method с флагом true
                method.setAccessible(true);
                //Вызываем метод invoke() объекта Method и передаем два параметра:
                // 1 - это объект, класс которого объявляет или наследует данный метод (object)
                // 2 - массив значений параметров, которые передаются вызываемому методу, в нашем случае это значение переменной boolean
                method.invoke(object, mobileDataEnabled);
            } catch (Exception e) {
            }
        }
    }
Для API < 21 в AndroidManifest должны быть добавлены разрешения
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
Для API >= 21 еще одно разрешение
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
но увы, оно для системных приложений и тогда чтобы можно было управлять мобильными данными нужен root.

Может кто знает как без root для API >= 21 можно управлять мобильными данными?

Ответить