You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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实现两端通信:

  1. 原生端注册桥接对象
webView.addJavascriptInterface(object {
    @JavascriptInterface
    fun switchToEarpiece() {
        // 执行切换到听筒的逻辑
    }

    @JavascriptInterface
    fun switchToSpeaker() {
        // 执行切换到扬声器的逻辑
    }
}, "AudioSwitch")
  1. Web端PeerJS收到音频流后调用原生方法
call.on('stream', (stream) => {
    // 播放流逻辑
    window.AudioSwitch.switchToEarpiece()
})

内容的提问来源于stack exchange,提问作者Sujith S Manjavana

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 12:15:02