用户在进行实时音视频通话的过程中,可能会被系统电话,第三方应用,或其他系统行为打断,RTC 将通过系统回调,在打断结束时,恢复音视频通话。
在音视频通话被打断时,RTC 的预期表现如下表。
| 打断类型 | Android | iOS | Windows/macOS |
|---|---|---|---|
系统电话 | 音频:暂停,通话结束后自动恢复 | 音频:暂停,通话结束后自动恢复 | 不适用 |
第三方应用 | 音视频:被打断,无法自动恢复,将回调设备采集状态 | 音视频:暂停,占用结束后自动恢复 | 由操作系统决定,例如设备被抢占导致 RTC 采集不到数据,将回调相应状态 |
锁屏/ PC 合盖 | 音频:正常 | 音频:正常 | 音频:正常 |
| 应用处于侧拉、分屏或者画中画模式 | 不适用 | 视频:被打断,将回调设备采集状态,打断结束后自动恢复 | 不适用 |
| 系统性能不足(如设备过热) | 不适用 | 视频:被打断,将回调设备采集状态,打断结束后自动恢复 | 不适用 |
| 应用切换到后台 | 不适用 | 视频:被打断,将回调设备采集状态,打断结束后自动恢复 | 不适用 |
除了 RTC 无法自动恢复的音视频采集外,你还需要关注打断和恢复时远端音视频播放状态,实现以下的订阅相关设置。
你可以通过监听 onAudioDeviceStateChanged 和 onVideoDeviceStateChanged 回调,了解采集设备被打断和自动恢复的情况。
自 3.38.1 开始,RTC SDK 新增以下枚举值,反映当前打断状态。
InterruptionBegan: 被打断
InterruptionEnded: 已恢复
在 RTC 通话被打断时,调用 pauseAllSubscribedStream 暂停接收所有远端用户。 按照上方表格,指定暂停接收的媒体流类型为音频或视频。
在 RTC 通话从打断中恢复时,调用 resumeAllSubscribedStream 恢复订阅所有远端用户。监听以下回调,了解音视频的采集状态。
onAudioDeviceStateChanged、onVideoDeviceStateChanged
state: RuntimeError
error: DeviceNoCallback
onAudioDeviceWarning、onVideoDeviceWarning
当从以上回调监听到采集异常时,你可以尝试通过再次调用 startVideoCapture 或 startAudioCapture 来进行恢复。
默认情况下,SDK 会监听 Android 系统电话事件,在系统通话期间关闭音频模块。确保 app 中没有包含拦截系统电话事件(CALL_STATE_IDLE 和 CALL_STATE_OFFHOOK)的业务逻辑,否则 RTC 将无法感知系统电话,可能造成用户通话时仍继续发送音视频流。
由于 Android 9 以上版本的系统限制,音视频通话将在锁屏后采集失败,但使用前台服务可以让应用正常工作。如果你希望锁屏后仍能采集音频或视频的,建议在锁屏或退至后台前起一个 Service,并在退出锁屏或返回前台前终止 Service。