打断事件处理
使用融云 RTCLib 进行会议或直播过程中,可能会收到系统来电、应用切后台等打断事件,开发者需根据业务场景自行处理打断事件。
本文以系统来电、切后台为例,介绍如何处理打断事件。其他打断事件处理,如第三方应用语音通话、弹出闹钟等,开发者需根据具体情况注册相应监听,结合业务特性选择合适时机处理音频打断。
系统来电
监听来电事件
开发者根据业务场景,选择合适的时机,在 App 层注册来电监听。一般在发起音频通话页面的 onCreate() 方法中设置。
处理音频打断
提示
- SDK 从 5.3.2 版本开始提供暂停和恢复音频设备的 API(
pauseAudioModule
和resumeAudioModule
)。 - 如果您使用的 SDK 版本低于 5.3.2,可以参考旧版 SDK 处理音频打断事件的方案(SDK < 5.3.2)。
- 收到音频打断时,调用
RCRTCEngine
中的pauseAudioModule()
方法,暂停音频设备。 - 音频打断恢复后,调用
RCRTCEngine
中的resumeAudioModule()
方法,恢复音频设备。
/** 暂停音频设备模块 用于需要暂停音频设备模块的场合,例如来电时 */
public abstract void pauseAudioModule();
/** 恢复音频设备模块 用于需要恢复音频设备模块的场合,例如通话结束时 */
public abstract void resumeAudioModule();
移除来电事件监听
注册来电监听事件后,不需要时应及时移除监听事件,否则会造成内存泄漏甚至引起未知错误。一般在发起音频通话页面的 onDestroy() 方法中移除。
/**
* 注销电话状态监听
*/
private void unregisterYourPhoneCallingListener() {
TelephonyManager tm = (TelephonyManager) getSystemService(Service.TELEPHONY_SERVICE);
tm.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);
mPhoneStateListener = null;
}
切后台
支持后台播放
默认情况下, 应用切后台时,音频模块不会停止工作,不需要做任何特殊处理。除非系统在做内存回收时,将应用强制退出,此时音频模块也会停止工作。
停止后台播放
提示
- SDK 从 5.3.2 版本开始提供暂停和恢复音频设备的 API(
pauseAudioModule
和resumeAudioModule
)。 - 如果您使用的 SDK 版本低于 5.3.2,可以参考旧版 SDK 处理音频打断事件的方案(SDK < 5.3.2)。
5.3.2 及之后版本,如果想在应用切到后台后停止/恢复音频模块,开发者需要主动调用 pauseAudioModule
、resumeAudioModule
来实现暂停、恢复音频模块功能。
旧版 SDK 处理音频打断的方案(SDK < 5.3.2)
收到音频打断时,开发者需调用指定方法处理远端及本地的媒体流。
- 静音远端音频流:调用
RCRTCRoom
中的muteAllRemoteAudio
方法,设置为true
,静音远端所有流。详见音量中「静音全部远端音频流」方法。 - 处理本地音频流,可以选任一种方式:
- 静音本地音频流:调用
RCRTCStream
接口提供的mute(boolean mute)
方法,设置为true
,静音本地音频流。静音后,不再发送本地资源,也不能播放,但不影响音频数据采集。详见音量中对应介绍。 - 关闭麦克风:调用
RCRTCMicOutputStream
中的setMicrophoneDisable
方法,设置为true
,关闭麦克风。详见麦克风中对应介绍。 - 取消发布本地默认音视频流:会议场景下调用
RCRTCLocalUser
中的unpublishDefaultStreams
取消发布默认音视频流。直播场景下需调用unpublishDefaultLiveStreams
方法。详见「音视频会议」/「低延迟直播」中发布资源相关介绍。
- 静音本地音频流:调用
音频打断恢复后,调用指定方法恢复远端及本地的媒体流。
- 取消远端音频流静音:调用
RCRTCRoom
中的muteAllRemoteAudio
方法,设置为false
,取消远端音频流静音。 - 恢复本地音频流:请参考处理本地音频流中选用的方式进行恢复。