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

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

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

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

На это есть ответ, я цитирую:

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

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

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

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

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

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

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

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

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

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

Solutions Collecting From Web of "Последнее обновление по включению и отключению мобильных данных программно"

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

Метод 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() больше не может быть вызван посредством отражения. Это было вызвано с Android 2.1 (API 7) до Android 4.4 (API 19) с помощью рефлексии, но с Android 5.0 и более поздних setMobileDataEnabled() , даже с укоренившимися телефонами, метод setMobileDataEnabled() не может быть вызван.