Suj*_*ana 6 android android-audiomanager
我正在使用 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
}
Run Code Online (Sandbox Code Playgroud)
上面的代码在旧版本的 android 上运行良好,但在 android 12(模拟器)上运行不佳。
am.isSpeakerphoneOn在 android 12 中始终如此。我在这里做错了什么吗?或者是模拟器的bug?
Android 12/S/API 31 中有一个新的 API 调用,setCommunicationDevice(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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
不需要更改模式(但强烈建议进行 VoIP 呼叫)并且我的流是AudioManager.STREAM_VOICE_CALL类型(如果适用)
默认情况下,webrtc 使用耳机进行语音播放。但是,您也可以调用AudioManager.javasetSpeakerphoneOn(false)类中定义的。
只需在此函数参数中传递 false 即可在通话中禁用扬声器并使用听筒。我也在 android 12 手机上进行了测试,运行良好。
如果问题仍然存在,那么您的模拟器中存在一些错误。
| 归档时间: |
|
| 查看次数: |
2585 次 |
| 最近记录: |