#android #android-audiomanager
Вопрос:
Я разрабатываю приложение для голосовых вызовов для Android с использованием PeerJS и WebView. И я хочу, чтобы звук воспроизводился через наушник. Вот мой код,
private fun initAudio(){ am = getSystemService(AUDIO_SERVICE) as AudioManager volumeControlStream = AudioManager.STREAM_VOICE_CALL am.mode = AudioManager.MODE_IN_COMMUNICATION am.isSpeakerphoneOn = false//lt;= not working in android 12 } private fun toggleSpeakerMode(){ am.isSpeakerphoneOn = !am.isSpeakerphoneOn // lt;= final value is always true in android 12 }
Приведенный выше код отлично работает в старых версиях Android, но не в Android 12 (эмулятор). am.isSpeakerphoneOn
всегда верно в Android 12. Я что-то здесь делаю не так? Или это ошибка в эмуляторе?
Обновить
Эта проблема возникает только после запуска потока WebRTC в WebView (я могу переключить громкоговоритель перед потоком).
Ответ №1:
По умолчанию webrtc использует динамик для воспроизведения голоса. Однако в качестве альтернативы Вы можете вызвать setSpeakerphoneOn(false)
то,что определено в AudioManager.java класс.
Просто передайте значение false в этом параметре функции, и он отключит громкоговоритель телефона во время вызова, и будет использоваться динамик. Я также протестировал его на телефонах Android 12, и он работает нормально.
Если проблема все еще сохраняется, то у вас есть какая-то ошибка в вашем эмуляторе.
Комментарии:
1. Я использую библиотеку javascript PeerJS в веб-представлении для вызовов (не библиотеку Android WebRTC). И я могу использовать наушник до того, как начнется трансляция (для звука звонка). Но когда мы получаем поток, он всегда воспроизводится через громкоговоритель. Средство
setSpeakerphoneOn(false)
не имеет эффекта,am.isSpeakerphoneOn
true
всегда возвращается при потоковой передаче.