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

Flutter WebRTC应用如何在用户接听第三方通话时自动结束当前通话

WebRTC应用监听第三方应用来电并中断当前通话的实现方案

要实现监听用户接听外部来电的能力,需要在移动端原生层监听系统/第三方应用的音频占用状态,再和Web层的WebRTC逻辑做通信触发挂断,分端实现逻辑如下:

安卓端实现

  • 核心依赖安卓系统的音频焦点监听机制,所有通话类应用(包括系统电话、WhatsApp、Messenger等VoIP应用)在发起/接收通话时都会抢占音频焦点,通过监听焦点变更即可感知外部通话状态:
    • 在原生项目中注册AudioManager.OnAudioFocusChangeListener音频焦点监听器
    • 当收到AUDIOFOCUS_LOSS_TRANSIENT状态回调时,代表临时丢失音频焦点,对应用户正在收到第三方来电响铃
    • 当收到AUDIOFOCUS_LOSS状态回调时,代表音频焦点被永久抢占,对应用户已经接听第三方来电
  • 监听到对应状态后,通过WebView的JavascriptInterface调用前端暴露的全局回调函数,把事件同步给WebRTC层
  • 若需要额外区分系统通话和第三方VoIP通话,可以搭配TelephonyManager监听CALL_STATE_RINGING(响铃)、CALL_STATE_OFFHOOK(接通)状态做补充判断

iOS端实现

  • 核心依赖iOS系统的AVAudioSession中断通知,所有需要独占音频的通话类应用都会触发音频会话中断:
    • 注册AVAudioSessionInterruptionNotification通知观察者,监听音频会话的中断事件
    • 解析通知携带的AVAudioSessionInterruptionTypeKey字段,值为AVAudioSessionInterruptionTypeBegan时代表中断开始,对应收到外部来电响铃
    • 若中断触发后没有收到AVAudioSessionInterruptionTypeEnded的恢复通知,且音频会话已被其他应用激活,即可判定用户已接听第三方来电
  • 监听到对应事件后,通过WKWebView的evaluateJavaScript方法调用前端暴露的全局回调,同步事件给WebRTC层

前端WebRTC层适配逻辑

  • 提前在window全局对象上挂载原生层可调用的事件回调方法,比如onExternalCallRing、onExternalCallAnswered
  • 收到外部来电响铃通知时,可在当前通话界面提示用户有其他来电,可选提前主动挂断当前通话
  • 收到用户已接听外部来电的通知后,直接执行当前通话的挂断逻辑:
// 挂断示例代码
// 关闭WebRTC连接
peerConnection.close();
// 停止本地音视频轨
localStream.getTracks().forEach(track => track.stop());
// 通知对端用户当前通话因外部来电中断
signalingChannel.send(JSON.stringify({
  type: 'call_interrupted',
  reason: 'external_call_answered'
}))

内容的提问来源于stack exchange,提问作者Ibrahim Ali

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 13:03:00