Аудио перестает записывать через минуту
Я пытаюсь сделать WebRTC, все работает нормально, но, похоже, есть проблема, то есть, если экран остается выключенным более минуты, звук перестает записываться, то есть звук с устройства останавливается, пока я не переключу снова включите экран.
Что я пробовал?
1) Я попытался установить webSettings.setMediaPlaybackRequiresUserGesture(false);
, но это не помогло.
2) Я также попытался добавить wakelock
в действие, в котором я выполняю WebRTC, но оно также не сработало.
Вот разрешения, объявленные в манифесте:
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
Здесь, в действии, я даю разрешение на микрофон в WebChromeClient
:
@Override
public void onPermissionRequest(final PermissionRequest request) {
request.grant(request.getResources());
}
Что я хочу?
Я хочу иметь возможность продолжить звонок, не мешая пользователю снова включить экран. Пожалуйста, направьте меня в правильном направлении.
Спасибо!
Обновление. Я попытался загрузить URL-адрес WebRTC в Chrome, и происходит то же самое, то есть звук останавливает запись с моего устройства.
Обновление 2: добавление журнала, когда звук перестает поступать с устройства.
2019-08-06 17:18:47.266 4332-22405/? V/APM_AudioPolicyManager: getAudioPolicyConfig: audioParam;outDevice
2019-08-06 17:18:47.266 4332-22405/? V/APM_AudioPolicyManager: getNewOutputDevice() selected device 2
2019-08-06 17:18:47.266 4332-22405/? V/APM_AudioPolicyManager: ### curdevice : 2
2019-08-06 17:18:47.307 4332-22405/? V/APM_AudioPolicyManager: AudioPolicyManager:setRecordSilenced(uid:99066, silenced:1)
2019-08-06 17:18:47.308 4332-22405/? V/APM_AudioPolicyManager: AudioPolicyManager:setRecordSilenced(uid:11556, silenced:1)
Обновление 3: попытка инициализации WebView
в Foreground Service
по-прежнему тот же результат.
Обновление 4: пробный демонстрационный вызов на https://appr.tc/ с использованием Chrome (76.0.3809.132). Наблюдается тот же результат.
Обновление 5: пробовал демонстрационный вызов с использованием Firefox, и он работал безупречно, что позволяет мне думать, что это ошибка Chromium?
Обновление 6: заполнен отчет об ошибке report
Ответы
Ответ 1
Проверьте версию Chrome/Android из-за этой проблемы с WebRTC на Android:
Ошибка 513633: вызов WebRTC в Chrome на Android будет отключен через 1 минуту после выключения экрана
WebRTC поддерживается в Chrome по умолчанию, поэтому... он должен работать.
Кстати, если вам не нужен WebRtc или вы хотите попробовать реализовать его в фоновом режиме...
Интересные чтения:
1 - запись при выключении экрана
Как говорится в сообщении, имейте в виду:
Для вызова:
startForeground();
Использовать START_STICKY:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return START_STICKY;
}
2 - как реализовать рекордер
Как говорится в сообщении, имейте в виду разрешения:
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Фоновые службы с Apache Cordova
В случае с cordova и веб-представлением вам нужно использовать плагин для запуска кода в фоновом режиме в качестве службы.
Взгляните на эту ссылку:
плагин Cordova
Другой вариант с Cordova - создать свой собственный плагин, например:
пользовательский плагин - фоновый видеорегистратор
Ответ 2
Android автоматически уничтожит вашу активность через несколько минут после выхода из переднего плана, что приведет к отключению записи звука.
Я работаю с webrtc на Android, если вы хотите создать вызов и видеовызов с помощью webrtc на Android, я предлагаю использовать нативный webrtc и реализовать все, что связано с webrtc, на сервисе переднего плана. Служба Foreground гарантирует, что ваш рекордер и камера продолжат работать, когда активность будет уничтожена.
Для справки, здесь пример Google для реализации родного webrtchttps://webrtc.googlesource.com/src/+/master/examples/androidapp/src/org/appspot/apprtc
Ответ 3
Во время разговора вы должны позаботиться о том, чтобы экран оставался включенным и не уменьшайте яркость.
Используйте это:
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
и после того, как ваш звонок завершен:
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
Ответ 4
Очевидно, это не обычная задача, потому что все ваши реализации, это просто WebView
. Что очень сложно совместить с таким долгоживущим заданием и жизненным циклом внутри Android. Например Каждое приложение VoIP
, которое мы делали, имело службы в фоновом режиме, чтобы поддерживать соединение, с блокировками активизации Это был только один способ обеспечить стабильность звонка.
Тем не менее, я думаю, вы могли бы попытаться сделать то же самое. Управляя своей работой WebView
внутри Сервиса. Для этой цели вы можете рассмотреть возможность перемещения некоторой логики вызова в другое представление, запуска нового Service
и создания нового Window
. Это гарантирует, что ваш Window
будет жив, в течение всего жизненного цикла Service
.
Что-то вроде.
public class ServiceWithWebView extends Service {
@Override
public void onCreate() {
super.onCreate();
final WindowManager windowManager = (WindowManager)
getSystemService(WINDOW_SERVICE);
params = new WindowManager.LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY);
final LinearLayout view = new LinearLayout(this);
view.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout
.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT));
WebView wv = new WebView(this);
wv.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout
.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT));
view.addView(wv);
wv.loadUrl("http://google.com");
windowManager.addView(view, params);
}
}
Ответ 5
Возможно, проблема в оптимизации батареи. Устройство очищает фоновые процессы и находит там ваш экран аудиозаписи, работающий на фоне. попробуйте добавить приложение в список Battery Best Performance. Найдите, как это сделать на вашем устройстве.
Для моего случая даже важные фоновые задачи в качестве службы доступности вынуждены останавливаться в соответствии с этим алгоритмом оптимизации батареи. Чтобы моя служба работала постоянно, пользователь должен добавить приложение в белый список правил наилучшей производительности батареи.
Я надеюсь, что это может помочь вам.