Аудио перестает записывать через минуту

Я пытаюсь сделать 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. Найдите, как это сделать на вашем устройстве.

Для моего случая даже важные фоновые задачи в качестве службы доступности вынуждены останавливаться в соответствии с этим алгоритмом оптимизации батареи. Чтобы моя служба работала постоянно, пользователь должен добавить приложение в белый список правил наилучшей производительности батареи.

Я надеюсь, что это может помочь вам.