android WebView воспроизводит аудио через наушник или Bluetooth

#android #audio #webview #webrtc #peerjs

Вопрос:

Я разрабатываю приложение для голосовых вызовов с помощью peer.js и веб-просмотр. Мое намерение состоит в том, чтобы воспроизводить удаленный поток через наушник или наушники Bluetooth(если они подключены). И должна быть возможность также переключиться на громкоговоритель. Я попробовал следующий код, но звук по-прежнему исходит из динамика.

    private fun setupAudio() {
        val am = getSystemService(AUDIO_SERVICE) as AudioManager
        am.mode = AudioManager.MODE_IN_CALL
        am.isSpeakerphoneOn = false
    }
 

Есть ли лучший способ сделать это? Или я могу изменить тип аудиопотока WebView(например, как в MediaPlayer)?

Ответ №1:

обязательно добавьте <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> разрешения на манифест.

если это не устранило проблему, пожалуйста, попробуйте

 Class audioSystemClass = Class.forName("android.media.AudioSystem");
Method setForceUse = audioSystemClass.getMethod("setForceUse", int.class, int.class);
// First 1 == FOR_MEDIA, second 1 == FORCE_SPEAKER. To go back to the default
// behavior, use FORCE_NONE (0).
setForceUse.invoke(null, 1, 1);
 

Комментарии:

1. У меня есть такое разрешение.

2. попробуйте это Class audioSystemClass = Class.forName("android.media.AudioSystem"); Method setForceUse = audioSystemClass.getMethod("setForceUse", int.class, int.class); // First 1 == FOR_MEDIA, second 1 == FORCE_SPEAKER. To go back to the default // behavior, use FORCE_NONE (0). setForceUse.invoke(null, 1, 1);

3. получил это предупреждение: Доступ к внутренним API через отражение не поддерживается и может работать не на всех устройствах или в будущем

4. Это не работает

5. Получение ошибки E/AudioSystem-JNI: Command failed for android_media_AudioSystem_setForceUse: -1

Ответ №2:

У меня это работает, фокус в том, чтобы позвонить am.isSpeakerphoneOn = false после получения потока.