Как обеспечить сетевое подключение для 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, пожалуйста, не убивайте мою длинную работу"
- Переместите код передачи потока в службу, запущенную на переднем плане
- Поддерживайте работу процессора (при необходимости)
- Убедитесь, что ваше приложение исключено из режима доз (потому что пользователь должен сделать это за вас, вы должны объяснить причину в приятном оверлее, прежде чем просить об этом)
Проверка:
PowerManager powerManager =
(PowerManager)getActivity().getSystemService(Activity.POWER_SERVICE);
powerManager.isIgnoringBatteryOptimizations(getActivity().getPackageName());
Спрашивая белый список:
Intent intent = new Intent(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS);
startActivity(intent);
Не рассматривайте это как поощрение использовать это как общий подход. Есть только несколько случаев использования, которые узаконивают эту процедуру.