Подтвердить что ты не робот

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

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

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

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

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

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

Есть также эта дискуссия:

Замена для setMobileDataEnabled() API
Который февраль 2015

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

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

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

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

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

Что нового по этому вопросу?

Это все еще можно сделать?

4b9b3361

Ответ 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
    }
}