Состояние сети "ЗАБЛОКИРОВАНО", когда функция экономии трафика 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 отключает интернет-соединение и все фоновые службы. Вам нужно вывести устройство из спящего режима, и после этого вы сможете выполнять все действия с Интернетом. Документация