简介
我们遇到一个bug : 用户在语音房内游戏, 正在使用 "扬声器" 进行语音互动, 突然收到了 "微信语音邀请" , 该用户使用 "听筒模式" 进行接听 "微信语音", 结束之后返回APP, 发现音频路由还是 "听筒模式", 而没有切换回 "扬声器模式"
问题描述
用户在语音房内游戏, 正在使用 "扬声器" 进行语音互动, 突然收到了 "微信语音邀请" , 该用户使用 "听筒模式" 进行接听 "微信语音", 结束之后返回APP, 发现音频路由还是 "听筒模式", 而没有切换回 "扬声器模式"
问题原因
在我们APP切换到其他有音频输入/输出的APP时(比如 微信/QQ …), 其他APP可能会修改 “声网SDK” 的音频路由,
由于“声网SDK”没有权限检测其他APP对音频路由的修改, 所以也无法判断是否已经从其他APP切换回我们的APP,
从而切换回我们之前的音频路由, 因此仍然使用其他APP的音频路由设置.
解决方案
在语音房界面的 onResume 方法中, 检测当前的音频路由, 然后调用 setEnableSpeakerphone 方法重新设置音频路由.可参考以下示例代码。
在语音房界面(Activity)的 onResume()中调用下面方法.
void adjustAudioRoute(Activity activity) {
DebugLog.e(vcrSdk.TAG_AUDIO_ROUTE_DEBUG, "adjustAudioRoute --> ");
if (!vcrSdk.isInVoiceRoom()) {
// 没在语音房内玩耍了
return;
}
try {
AudioManager audioManager = (AudioManager) activity.getSystemService(Context.AUDIO_SERVICE);
if (audioManager.isSpeakerphoneOn()) {
DebugLog.e(vcrSdk.TAG_AUDIO_ROUTE_DEBUG, "adjustAudioRoute --> 当前音频路由为 [设备自带的扬声器]");
} else if (audioManager.isBluetoothScoOn() || audioManager.isBluetoothA2dpOn()) {
DebugLog.e(vcrSdk.TAG_AUDIO_ROUTE_DEBUG, "adjustAudioRoute --> 当前音频路由为 [蓝牙耳机]");
} else if (audioManager.isWiredHeadsetOn()) {
DebugLog.e(vcrSdk.TAG_AUDIO_ROUTE_DEBUG, "adjustAudioRoute --> 当前音频路由为 [带麦克风的耳机]");
} else {
DebugLog.e(vcrSdk.TAG_AUDIO_ROUTE_DEBUG, "adjustAudioRoute --> 当前音频路由为 [听筒]");
// 在此处调用 setEnableSpeakerphone 方法,设置音频路由为听筒或扬声器
if (!vcrSdk.isLocalSpeakerMute()) {
// 本地扬声器没有静音
DebugLog.e(vcrSdk.TAG_AUDIO_ROUTE_DEBUG, "adjustAudioRoute --> 用户没有设置本地扬声器静音, 调用声网 rtcEngine.setEnableSpeakerphone(true) 开始校正音频路由.");
/**
* 开启/关闭扬声器播放。
* enabled 设置是否开启扬声器播放
* true:开启。音频路由为扬声器。
* false:关闭。音频路由为听筒。
*
* 如果 SDK 默认的音频路由(见《设置音频路由》)或 setDefaultAudioRoutetoSpeakerphone 的设置无法满足你的需求,
* 你可以调用 setEnableSpeakerphone 切换当前的音频路由。 成功切换音频路由后,SDK 会触发 onAudioRouteChanged 回调提示音频路由已更改。
*
* 该方法只设置用户在当前频道内使用的音频路由,不会影响 SDK 默认的音频路由。 如果用户离开当前频道并加入新的频道,则用户还是会使用 SDK 默认的音频路由。
*
* 注解
* 该方法需要在 joinChannel 后调用。
* 如果用户使用了蓝牙耳机、有线耳机等外接音频播放设备,则该方法的设置无效,音频只会通过外接设备播放。当有多个外接设备时,音频会通过最后一个接入的设备播放。
*/
int resultCode = rtcEngine.setEnableSpeakerphone(true);
if (resultCode < 0) {
DebugLog.e(vcrSdk.TAG_AUDIO_ROUTE_DEBUG, "adjustAudioRoute --> rtcEngine.setEnableSpeakerphone(true) 返回的 resultCode < 0, resultCode = " + resultCode);
}
} else {
DebugLog.e(vcrSdk.TAG_AUDIO_ROUTE_DEBUG, "adjustAudioRoute --> 用户之前已经设置了 本地扬声器静音!!!");
}
}
} catch (Exception e) {
e.printStackTrace();
}
}