Состояние сети "ЗАБЛОКИРОВАНО", когда функция экономии трафика Android отключена

Я разрабатываю приложение для конкретного планшета под управлением Android 7.0. Я используюService отправлять периодические DatagramPacketс. Я могу пользоваться только мобильными сетями. Я проверяю статус подключения с помощьюConnectivityManager, NetworkInfo а также DetailedState. Я получаю состояние сети с помощью этого кода:

ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
DetailedState networkState = activeNetwork.getDetailedState();
  • Если планшет подключен к сети, а экран включен или выключен, я получаю состояние ПОДКЛЮЧЕН.
  • Если планшет отключен и экран включен, я получаю состояние СОЕДИНЕН.
  • Если планшет отключен от сети и экран выключен, я получаю состояние ЗАБЛОКИРОВАНО.

В моем планшете отключена экономия трафика. На всякий случай провел тесты, чтобы убедиться, что нет ограничений при выключении экрана,cm.getRestrictBackgroundStatus()всегда возвращает 1, то есть RESTRICT_BACKGROUND_STATUS_DISABLED, даже если сеть заблокирована.

Итак, почему заблокирована сеть? Нужны ли моему приложению особые разрешения? Нужна ли моему планшету особая конфигурация?

2 ответа

Решение

Чтобы дать полное решение, отвечу на свой вопрос.

почему заблокирована сеть?

Как указано в документации, предоставленной Станиславом Киреевым, это состояние сети ЗАБЛОКИРОВАНО происходит из-за того, что устройство находится в дремоте. Это состояние устройства не разрешает доступ в Интернет, начиная с Android 6.0 (уровень API 23).

Но в документации также говорится, что "система предоставляет настраиваемый белый список приложений, которые частично освобождены от оптимизаций Doze и App Standby". Для более подробного объяснения вы можете прочитать раздел Поддержка других вариантов использования. Вы можете добавить свое приложение в белый список из кода или настройки системы.

Нужны ли моему приложению особые разрешения?

Если вам нужно добавить приложение в белый список из кода, вам необходимо добавить разрешение в файл манифеста:

<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>

И добавьте этот код в свою активность:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    String packageName = getPackageName();
    PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE);
    if (!pm.isIgnoringBatteryOptimizations(packageName)) {
        Intent intent = new Intent();
        intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
        intent.setData(Uri.parse("package:" + packageName));
        startActivity(intent);
    }
}

Я получил это решение из этого ответа.

Нужна ли моему планшету особая конфигурация?

При желании вы можете добавить свое приложение в " Настройки"> "Батарея"> "3 точки"> "Оптимизация батареи". Выберите Все приложения в списке выбора, выберите свое приложение и выберите параметр Не оптимизировать.

Я получил это решение из этого ответа (он имеет более подробное объяснение).

Это нормальное поведение. Когда ваш экран заблокирован, он использует режим сна. А режим Doze отключает интернет-соединение и все фоновые службы. Вам нужно вывести устройство из спящего режима, и после этого вы сможете выполнять все действия с Интернетом. Документация

Другие вопросы по тегам