Android WebRTC语音通话使用PeerJS+WebView如何切换音频输出到听筒
WebView + PeerJS 通话音频切换至听筒实现方案
前置准备
先在AndroidManifest.xml中添加必要权限:
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> <!-- 通话必备的录音权限,如已添加可忽略 --> <uses-permission android:name="android.permission.RECORD_AUDIO" />
MODIFY_AUDIO_SETTINGS为普通权限,应用安装时自动授予,无需动态申请。
核心实现逻辑
通过Android系统原生AudioManager控制音频路由,无需修改Web端PeerJS的业务代码。
切换到听筒
val audioManager = getSystemService(Context.AUDIO_SERVICE) as AudioManager // 将音频模式设置为通话模式 audioManager.mode = AudioManager.MODE_IN_COMMUNICATION // 关闭扬声器 audioManager.isSpeakerphoneOn = false // 绑定音量键控制通话音量 volumeControlStream = AudioManager.STREAM_VOICE_CALL
切换到扬声器
val audioManager = getSystemService(Context.AUDIO_SERVICE) as AudioManager audioManager.mode = AudioManager.MODE_IN_COMMUNICATION // 开启扬声器 audioManager.isSpeakerphoneOn = true volumeControlStream = AudioManager.STREAM_VOICE_CALL
通话结束后重置音频模式
避免影响其他应用的音频输出:
audioManager.mode = AudioManager.MODE_NORMAL volumeControlStream = AudioManager.USE_DEFAULT_STREAM_TYPE
WebView适配配置
需提前为WebView开启相关配置,避免切换逻辑不生效:
- 开启JavaScript支持(PeerJS运行必备,如已配置可忽略):
webView.settings.javaScriptEnabled = true - 关闭媒体播放需用户手势的限制:
webView.settings.mediaPlaybackRequiresUserGesture = false
可选:JS桥接触发切换
如果需要在Web端通话接通后自动触发切换,可通过JavascriptInterface实现两端通信:
- 原生端注册桥接对象
webView.addJavascriptInterface(object { @JavascriptInterface fun switchToEarpiece() { // 执行切换到听筒的逻辑 } @JavascriptInterface fun switchToSpeaker() { // 执行切换到扬声器的逻辑 } }, "AudioSwitch")
- Web端PeerJS收到音频流后调用原生方法
call.on('stream', (stream) => { // 播放流逻辑 window.AudioSwitch.switchToEarpiece() })
内容的提问来源于stack exchange,提问作者Sujith S Manjavana
相关产品推荐
相关产品推荐

