[声网音频SDK实战教程] 用户在语音房内游戏, 正在使用 "扬声器" 进行语音互动, 突然收到了 "微信语音邀请" , 该用户使用 "听筒模式" 进行接听 "微信语音", 结束之后返回APP, 发现音频路由还是 "听筒模式", 而没有切换回 "扬声器模式"

简介

我们遇到一个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();
        }
    }


推荐阅读
相关专栏
开发者实践
186 文章
本专栏仅用于分享音视频相关的技术文章,与其他开发者和声网 研发团队交流、分享行业前沿技术、资讯。发帖前,请参考「社区发帖指南」,方便您更好的展示所发表的文章和内容。