#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
после получения потока.