Android Twilio视频通话结束后“A Call is in Progress”通知不消失问题求助
问题根因
- 资源释放时序错误:当前代码先释放视频轨、再执行房间断开操作,未等SDK底层完全断开连接就释放资源,不符合Twilio SDK的资源释放规范,Redmi的MIUI系统对音视频资源占用的检测逻辑比原生Android更严格,时序错误就会导致系统误判麦克风仍被占用。
- 缺失音频轨取消发布逻辑:仅对本地视频轨做了unpublish处理,本地音频轨未从房间取消发布,导致SDK一直持有麦克风资源。
- 冗余的重复释放逻辑:代码中先后两次判断localVideoTrack是否存在并释放,第一次已经将变量置空,第二次逻辑完全无效,存在隐患。
修复方案
1. 修正资源释放时序及逻辑
首先调整killAllVideoProcess逻辑,先取消发布所有本地轨,再触发房间断开,所有资源释放操作移到房间断开回调中执行:
// 先执行取消发布+触发断开 private fun killAllVideoProcess() { localParticipant?.let { participant -> localVideoTrack?.let { participant.unpublishTrack(it) } localAudioTrack?.let { participant.unpublishTrack(it) } // 新增音频轨取消发布 } // 触发房间断开,后续释放在onDisconnected回调执行 room?.takeIf { it.state != Room.State.DISCONNECTED }?.run { disconnect() disconnectedFromOnDestroy = true } } // 在你注册的Room.Listener实现类中添加onDisconnected回调处理 override fun onDisconnected(room: Room, disconnectError: TwilioException?) { // 所有资源释放在此处执行 localVideoTrack?.release() localVideoTrack = null localAudioTrack?.release() localAudioTrack = null // 显式停止Twilio音频设备采集 DefaultAudioDevice(requireContext()).apply { stop() release() } // MIUI适配:主动释放音频焦点,通知系统麦克风已停用 val audioManager = requireContext().getSystemService(Context.AUDIO_SERVICE) as AudioManager audioManager.abandonAudioFocus(null) // 兜底:清除系统通话类通知 val notificationManager = requireContext().getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager notificationManager.cancel(12345) // 如果你的通话通知有固定ID就填对应ID,没有可以调用cancelAll() this.room = null }
2. MIUI权限补充检查
检查AndroidManifest.xml是否添加了Android 12+ required的通话前台服务权限:
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_PHONE_CALL" />
Redmi的MIUI系统对该权限校验严格,缺失的情况下会出现通话状态无法重置的问题。
验证方法
修改后执行通话-挂断流程,在开发者选项的「权限使用记录」中查看麦克风的占用状态,确认挂断后应用不再占用麦克风即可。
内容的提问来源于stack exchange,提问作者Hascher
相关产品推荐
相关产品推荐

