Как обеспечить сетевое подключение для Android-приложения в режиме ожидания?

В настоящее время я пишу приложение для Android, которое использует webview и webrtc для передачи аудиопотока. Проблема, по крайней мере, на моем мобильном телефоне, соединение отключается через несколько минут после выключения экрана.

Я уже приобрел блокировку процессора и wifi-lock (проверен с isHeld), но это не имеет никакого значения.

Приложение также доступно в виде веб-приложения: здесь он работает так, как ожидалось, и соединение остается в живых.

Я уже проверил настройки wifi: он всегда включен.

Любые указатели/идеи получили высокую оценку. Приложение является открытым исходным кодом, поэтому я рад поделиться любым кодом, если это поможет в любом случае. Блокировка захвата выполняется следующим образом:

private void grabWakeLock() {
  PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
  wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
                                               "MyWakelockTag");
  wakeLock.acquire();
  WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
  wifiLock = wifiManager.createWifiLock(WifiManager.WIFI_MODE_FULL_HIGH_PERF, "gonimo-wifi-lock");
  wifiLock.acquire();
}

У меня есть следующие разрешения в моем манифесте:

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
    <uses-feature android:name="android.hardware.camera.autofocus" />
    <uses-feature android:name="android.hardware.camera" />

Спасибо заранее!

Обновить:

Поводом для этого является Android Doze. В результате ручного запуска Doze происходит одинаковое поведение. Также

    return pm.isIgnoringBatteryOptimizations(packageName);

возвращает false, поэтому сеть будет отключена для приложения! Проблема: белый список, как описано в статье, похоже, не существует на моем телефоне. Я не могу найти его в настройках и делать:

    Intent intentBattery = new  Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
    intentBattery.setData(Uri.parse("package:" + "org.gonimo.gonimo"));
    startActivity(intentBattery);

приводит к исключению, что активность не может быть найдена.

Ответы

Ответ 1

Вот рецепт "Android, пожалуйста, не убивайте мою длинную работу"

  1. Переместите код передачи потока в службу, запущенную на переднем плане
  2. Поддерживайте работу процессора (при необходимости)
  3. Убедитесь, что ваше приложение исключено из режима доз (потому что пользователь должен сделать это за вас, вы должны объяснить причину в приятном оверлее, прежде чем просить об этом)

Проверка:

PowerManager powerManager =
     (PowerManager)getActivity().getSystemService(Activity.POWER_SERVICE);

powerManager.isIgnoringBatteryOptimizations(getActivity().getPackageName());

Спрашивая белый список:

Intent intent = new Intent(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS);
startActivity(intent);

Не рассматривайте это как поощрение использовать это как общий подход. Есть только несколько случаев использования, которые узаконивают эту процедуру.