Подскажите плиз решить две задачи:
1. Как проверить параметр Мобильные сети (Mobile data)? Интересует передача данных включена или нет, именно интересует какое состояние установлено в настройках
2. Как изменить параметр Мобильные сети (Mobile data)? Т.е. изменить его состояние с вкл. на выкл. и наоборот.
Для API 17 и выше.
Мобильные сети (Mobile data)
Re: Мобильные сети (Mobile data)
А что, никто не знает как данную задачу решить Гуру андроида отзовитесь, подскажите плиз.
Re: Мобильные сети (Mobile data)
На первый вопрос "Как проверить параметр Мобильные сети (Mobile data)" я уже нашел ответ:
В AndroidManifest должно быть добавлено разрешение
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
А вот на второй вопрос частично. API 17 все работает, а вот на API 21 не работает.
Разочарован я в этих Андроидах, система не стандартизирована и из-за это-го усложняется написание кода. Я так понимаю что на API 21 провели изменения и без рут доступа выполнить второй пункт невозможно.
Гуру специалисты, неужели некто не знает ответа на второй вопрос?
Код: Выделить всё
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;
}
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
А вот на второй вопрос частично. API 17 все работает, а вот на API 21 не работает.
Разочарован я в этих Андроидах, система не стандартизирована и из-за это-го усложняется написание кода. Я так понимаю что на API 21 провели изменения и без рут доступа выполнить второй пункт невозможно.
Гуру специалисты, неужели некто не знает ответа на второй вопрос?
Последний раз редактировалось LexusAVG 24 дек 2015, 12:04, всего редактировалось 1 раз.
Re: Мобильные сети (Mobile data)
Ну видимо профи тут нет, но вдруг кому понадобится решить аналогичную задачу тогда вот:
Для 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 можно управлять мобильными данными?
Код: Выделить всё
//Установить состояние мобильных данных
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) {
}
}
}
<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 можно управлять мобильными данными?