Последнее обновление по включению и отключению мобильных данных программно

Хотя это «дубликат», текущие ответы устарели и, в основном, больше не применяются. Я подумал, что было бы полезно предоставить обновленный ресурс здесь, если это возможно, чтобы спасти людей, как я только что сделал, исследуя эту проблему.

Я искал самую последнюю информацию о возможности включения и отключения мобильных данных из приложения (если Wi-Fi недоступен).

Это одна из последних вещей, которые я могу найти:
Знаете ли вы, что больше не можете отключить / включить данные на леденец из виджета?

Ответ на этот вопрос я цитирую:

Для этого никогда не было API. Разработчики использовали обходной путь, вызвав метод через Reflections. Все, что сделал Google, было связано с этим «эксплойтом».

Существует также такая дискуссия:

Замена для setMobileDataEnabled () api
Это февраль 2015 года.

Здесь есть следующие вопросы:

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

Это было задано в 2010 году, и последний ответ был обновлен одним лайнером в декабре 2014 года.

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

И это, принятый ответ в 2012 году.

Что нового в этой проблеме?

Можно ли это сделать?

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

Метод setMobileDataEnabled был удален из ConnectivityManager но два метода getDataEnabled и setDataEnabled были добавлены в TelephonyManager для этой функции.

 public void setMobileDataState(boolean mobileDataEnabled) { try { TelephonyManager telephonyService = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); Method setMobileDataEnabledMethod = telephonyService.getClass().getDeclaredMethod("setDataEnabled", boolean.class); if (null != setMobileDataEnabledMethod) { setMobileDataEnabledMethod.invoke(telephonyService, mobileDataEnabled); } } catch (Exception ex) { Log.e(TAG, "Error setting mobile data state", ex); } } public boolean getMobileDataState() { try { TelephonyManager telephonyService = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); Method getMobileDataEnabledMethod = telephonyService.getClass().getDeclaredMethod("getDataEnabled"); if (null != getMobileDataEnabledMethod) { boolean mobileDataEnabled = (Boolean) getMobileDataEnabledMethod.invoke(telephonyService); return mobileDataEnabled; } } catch (Exception ex) { Log.e(TAG, "Error getting mobile data state", ex); } return false; } 

Но вам нужно добавить это разрешение ( MODIFY_PHONE_STATE ) в файл манифеста, иначе вы получите SecurityException.

Он не будет работать на MODIFY_PHONE_STATE телефонах, поскольку они добавили MODIFY_PHONE_STATE разрешения MODIFY_PHONE_STATE . Это разрешение предоставляется только системным или сигнатурным приложениям, указанным здесь .

Проверьте код ниже с PhoneInterfaceManager :

 1853 @Override 1854 public void setDataEnabled(boolean enable) { 1855 enforceModifyPermission(); 1856 mPhone.setDataEnabled(enable); 1857 } 1308 private void enforceModifyPermission() { 1309 mApp.enforceCallingOrSelfPermission(android.Manifest.permission.MODIFY_PHONE_STATE, null); 1310 } 

Если у вас нет подключенного телефона, я не думаю, что вы можете включать и отключать данные программно, потому что для этого мы должны включить разрешение MODIFY_PHONE_STATE, которое предоставляется только системным или сигнатурным приложениям.

setMobileDataEnabled() больше не может быть вызван через reflection. Это было вызвано с Android 2.1 (API 7) до Android 4.4 (API 19) с помощью рефлексии, но с Android 5.0 и более поздних setMobileDataEnabled() , даже с использованием setMobileDataEnabled() телефонов, метод setMobileDataEnabled() не может быть вызван.

Легкий метод.

 public void setMobileDataState(boolean mobileDataEnabled) { try{ ConnectivityManager dataManager; dataManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); Method dataMtd = ConnectivityManager.class.getDeclaredMethod("setMobileDataEnabled", boolean.class); dataMtd.setAccessible(true); dataMtd.invoke(dataManager, mobileDataEnabled); }catch(Exception ex){ //Error Code Write Here } } 
  • проблема с правами на запись файла в папку «Program Files»
  • Что мне делать: для этого требуется android.permission.INTERACT_ACROSS_USERS_FULL
  • Разрешение перегрузки C ++
  • Метод checkSelfPermission не работает в targetSdkVersion 22
  • Как заставить приложение получать трансляцию, когда другие приложения установлены или удалены
  • Диалоговое окно подтверждения разрешения хоста
  • Обзор разрешений IIS7 - ApplicationPoolIdentity
  • Окно оверлей системы Android
  • Как использовать su для выполнения остальной части сценария bash как этого пользователя?
  • Разрешение отклонено в hdfs
  • Ошибка MySQL 1449: пользователь, указанный как определитель, не существует
  • Давайте будем гением компьютера.