You need to enable JavaScript to run this app. Android通话应用使用Self-managed Connection Service时音频流未重置问题
优惠活动
大模型
产品
解决方案
定价
更多

Android通话应用使用Self-managed Connection Service时音频流未重置问题

问题核心原因

当前代码仅处理了音频焦点释放和音量流重置,缺少对音频管理器模式、扬声器状态的重置,且音频资源释放的时机和ConnectionService生命周期未绑定,导致系统认为仍处于通话状态,强制音频输出到听筒。

修复步骤

  • 补全tearDownAudio逻辑,新增音频模式重置、扬声器状态重置代码,修正版本判断逻辑:
private fun tearDownAudio() {
    volumeControlStream = AudioManager.USE_DEFAULT_STREAM_TYPE
    // 重置音频模式为普通模式
    audioManager.mode = AudioManager.MODE_NORMAL
    // 重置扬声器状态,关闭强制通话输出到扬声器
    audioManager.isSpeakerphoneOn = false
    // 修正版本判断:AudioFocusRequest从API26(Android O)开始提供,应使用>=而非>
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        audioManager.abandonAudioFocusRequest(focusRequest)
    } else {
        @Suppress("DEPRECATION")
        audioManager.abandonAudioFocus(afChangeListener)
    }
}
  • 绑定释放逻辑到ConnectionService生命周期
    Self-managed ConnectionService的通话结束信号以Connection实例的销毁为准,与Activity生命周期无强制绑定,需要在Connection.onDestroy()方法中同步调用tearDownAudio(),避免Activity未触发onPause时音频资源未释放。
  • 新增通话状态标记避免逻辑冲突
    新增全局isCallActive布尔变量,通话开始时设为true,通话结束/Connection销毁时设为false,在initializeAudio、afChangeListener的逻辑中增加isCallActive判断,避免通话结束后重复申请通话音频焦点。
  • 检查ConnectionService实现
    通话结束后必须依次调用Connection.setDisconnected(DisconnectCause)、Connection.destroy(),通知系统通话已结束,避免系统保留通话音频路由策略。

定位排查技巧

每次执行tearDownAudio后打印日志,确认audioManager.mode是否为AudioManager.MODE_NORMAL、audioManager.isSpeakerphoneOn是否符合系统默认状态,即可快速定位是释放逻辑未执行还是执行后参数未生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 11:15:08