Последнее обновление по включению и отключению мобильных данных программно
Хотя это "дубликат", текущие ответы устарели и, по большей части, больше не применяются. Я подумал, что было бы хорошо предоставить обновленный ресурс здесь, если это возможно, чтобы сэкономить время людей, как я только что сделал, исследуя эту проблему.
Я гуглил, чтобы увидеть последнюю информацию о возможности включать и отключать мобильные данные из приложения (если Wi-Fi не доступен).
Это одна из последних вещей, которые я могу найти:
Знаете ли вы, что вы больше не можете отключить/включить данные на леденец из виджета?
На это есть ответ, я цитирую:
Там никогда не было API для этого. Разработчики использовали обходной путь, вызывая метод через Reflections. Все, что сделал Google, - это закрыл этот "подвиг".
Есть также эта дискуссия:
Замена для setMobileDataEnabled() API
Который февраль 2015
Здесь есть следующие вопросы:
Как отключить мобильные данные на Android
Этот вопрос был задан в 2010 году, а последний ответ был обновлен одним вкладышем в декабре 2014 года.
Включить/отключить передачу данных в Android программно
И это, принятый ответ в 2012 году.
Что нового по этому вопросу?
Это все еще можно сделать?
Ответы
Ответ 1
Я использую обходной путь, который работает только с корневыми телефонами.
Метод 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.
Ответ 2
Это не будет работать на некорневом телефоне, как они добавили MODIFY_PHONE_STATE
проверки прав доступа. Это разрешение предоставляется только системным приложениям или приложениям для подписи refer- здесь.
Проверьте код ниже из PhoneInterfaceManager:
@Override
public void setDataEnabled(boolean enable) {
enforceModifyPermission();
mPhone.setDataEnabled(enable);
}
private void enforceModifyPermission() {
mApp.enforceCallingOrSelfPermission(android.Manifest.permission.MODIFY_PHONE_STATE, null);
}
Ответ 3
Если у вас нет корневого телефона, я не думаю, что вы можете включать и отключать данные программно, потому что для этого нам нужно включить разрешение MODIFY_PHONE_STATE, которое предоставляется только системным или сигнатурным приложениям.
setMobileDataEnabled()
метод больше не может быть вызван через отражение. Это было вызвано с Android 2.1 (API 7) до Android 4.4 (API 19) с помощью рефлексии, но с Android 5.0 и более поздних версий, даже с использованием корневых телефонов, метод setMobileDataEnabled()
не может быть вызван.
Ответ 4
Перенесемся в конец 2018 года...
Короткий ответ: больше не разрешается включать/отключать мобильные данные программным способом. Вот решение, которое я использую все время.
Этот код открывает экран настроек использования системных данных, где пользователь может отключить мобильные данные вручную.
public void enableDisableMobileData() {
Intent intent = new Intent();
intent.setComponent(new ComponentName("com.android.settings", "com.android.settings.Settings$DataUsageSummaryActivity"));
startActivity(intent);
}
Ответ 5
Простой метод
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
}
}