如何在android 12中通过听筒播放音频?

我正在使用 PeerJS 和 WebView 为 android 开发语音通话应用程序。我希望音频通过听筒播放。这是我的代码,

private fun initAudio(){
  am = getSystemService(AUDIO_SERVICE) as AudioManager
  volumeControlStream = AudioManager.STREAM_VOICE_CALL
  am.mode = AudioManager.MODE_IN_COMMUNICATION
  am.isSpeakerphoneOn = false//<= not working in android 12
}

private fun toggleSpeakerMode(){
  am.isSpeakerphoneOn = !am.isSpeakerphoneOn // <= final value is always true in android 12
}

上面的代码在旧版本的 android 上运行良好,但在 android 12(模拟器)上运行良好。 am.isSpeakerphoneOn 在 android 12 中总是正确的。我在这里做错了吗?或者它是模拟器中的错误?

stack overflow How to play audio through earpiece in android 12?
原文答案

答案:

作者头像

Android 12/S/API 31 中有一个新的 API 调用, [setCommunicationDevice(AudioDeviceInfo)](https://developer.android.com/reference/android/media/AudioManager#setCommunicationDevice(android.media.AudioDeviceInfo) )。为了在扬声器和内置耳机之间切换,现在我们可以使用:

ArrayList<Integer> targetTypes = new ArrayList<>();
if (earpieceMode) {
    targetTypes.add(AudioDeviceInfo.TYPE_BUILTIN_EARPIECE);
} else { // play out loud
    targetTypes.add(AudioDeviceInfo.TYPE_BUILTIN_SPEAKER);
}
// more targetTypes may be added in some cases
// set up will pick and first available, so order matters

List<AudioDeviceInfo> devices = audioManager.getAvailableCommunicationDevices();
outer:
for (Integer targetType : targetTypes) {
    for (AudioDeviceInfo device : devices) {
        if (device.getType() == targetType) {
            boolean result = audioManager.setCommunicationDevice(device);
            Log.i("AUDIO_MANAGER", "setCommunicationDevice type:" + targetType + " result:" + result);
            if (result) break outer;
        }
    }
}

不需要更改模式(但强烈建议用于 voip 呼叫)并且我的流是 AudioManager.STREAM_VOICE_CALL 类型(如果适用)

作者头像

默认情况下,webrtc 使用耳机进行语音播放。但是,您也可以调用在 AudioManager.java 类中定义的 setSpeakerphoneOn(false)

只需在此函数参数中传递 false ,它将禁用通话中的免提电话并使用听筒。我还在 android 12 手机上对其进行了测试,它运行良好。

如果问题仍然存在,那么您的模拟器中有一些错误。