## 多人连麦接入文档

### 接入基本信息

基本信息 | 说明
--- | ---
支持版本 | 4.x版本
接入方式 | 本地、maven远程依赖
支持Android API最低版本 | 19

### 主动调用

#### 是否是多人连麦

方法 | 注视
--- | ---
`isMultiMediaCall()` | 是否是多人连麦

示例代码

    xxxxxxxxxxDWLive.getInstance().isMultiMediaCall()

#### 主动申请上麦

方法 | 注视
--- | ---
`public void callInPreviewWithType(RtcCallBack rtcCallBack, BaseRtcClient.RtcConnectType type)` | 主动申请上麦

示例代码

    xxxxxxxxxx
    DWLive.getInstance().callInPreviewWithType(new RtcCallBack() {            @Override            public void onFail(int code) {              //code （StreamErrorCode）-1：rtc连接超时；-2：初始化失败；-3：远端流失败；-4：rtc连接断开；-5：主动发起60s未收到老师同意；-8：连麦人数超限制             }
                @Override            public void onSuccess(HDMediaView hdMediaView) {               //hdMediaView 本地摄像头预览view，可能为null，单人连麦为null，音频连麦为null            }        },videoRtc?BaseRtcClient.RtcConnectType.AUDIOVIDEO:BaseRtcClient.RtcConnectType.AUDIO);

#### 同意上麦（多人连麦）

方法 | 注释
--- | ---
`public void agreeCallInPreview(RtcCallBack rtcCallBack, BaseRtcClient.RtcConnectType type)` | 同意上麦

示例代码

    xxxxxxxxxx
    DWLive.getInstance().agreeCallInPreview(new RtcCallBack() {            @Override            public void onFail(int code) {              //code （StreamErrorCode）-1：rtc连接超时；-2：初始化失败；-3：远端流失败；-4：rtc连接断开；-5：主动发起60s未收到老师同意；-8：连麦人数超限制             }
                @Override            public void onSuccess(HDMediaView hdMediaView) {               //hdMediaView 本地摄像头预览view，可能为null，单人连麦为null，音频连麦为null            }        },isVideoRtc()?BaseRtcClient.RtcConnectType.AUDIOVIDEO:BaseRtcClient.RtcConnectType.AUDIO);

#### 拒绝上麦（多人连麦）

方法 | 注释
--- | ---
`public void rejectCall()` | 拒绝上麦

示例代码

    xxxxxxxxxxDWLive.getInstance().rejectCall();

#### 挂断（下课也需要调用）

方法 | 注释
--- | ---
`public void hangup(BaseCallback baseCallback)` | 挂断

示例代码

    xxxxxxxxxx/** * 学员主动挂断 * 主动挂断连麦,用户主动点击下麦按钮时需要在onSuccess中处理下游逻辑，退出直播间、下课等调用  hangup时不需要关心callback */DWLive.getInstance().hangup(new BaseCallback() {            @Override            public void onError(String error) {                            }
                @Override            public void onSuccess(Object msg) {                            }        });

#### 设置本地视频开启（多人连麦）

方法 | 注释
--- | ---
`public void setLocalVideoEnable(boolean enable)` | 设置本地视频开启(开始直播之后生效)

示例代码

    xxxxxxxxxxDWLive.getInstance().setLocalVideoEnable(on);

#### 设置本地音频开启（多人连麦）

方法 | 注释
--- | ---
`public void setLocalAudioEnable(boolean enable)` | 设置本地音频开启(开始直播之后生效)

示例代码

    xxxxxxxxxxDWLive.getInstance().setLocalAudioEnable(on);

#### 切换本地摄像头（多人连麦）

方法 | 注释
--- | ---
`public void switchLocalCamera()` | 切换本地摄像头，默认前置

示例代码

    xxxxxxxxxxDWLive.getInstance().switchLocalCamera();

#### 拉取远端流

方法 | 注释
--- | ---
`public void pullRemoteStream(String userId, PullRemoteStreamCallBack baseCallback)` | 拉取远端流

示例代码

    xxxxxxxxxxDWLive.getInstance().pullRemoteStream(userId, new PullRemoteStreamCallBack() {            @Override            public void onError(String error) {                            }
                @Override            public void onSuccess(HDMediaView view, RemoteStreamInfo info) {               //view surface渲染视图 info：userId、userName、isAllowAudio、isAllowVideo            }        });

#### 移除远端流（多人连麦）

方法 | 注释
--- | ---
`public void removeRemoteStream(String userId, BaseCallback baseCallback)` | 移除远端流

示例代码

    xxxxxxxxxx DWLive.getInstance().removeRemoteStream(userId,null);

### 接口

#### 连麦相关接口 RTCConnectListener

##### 房间是否允许连麦

方法 | 注释
--- | ---
`void onMediaCallStatusDidChange(boolean isAllowSpeak, BaseRtcClient.RtcConnectType type)` | 房间是否允许连麦

##### 远端流可用

方法 | 注释
--- | ---
`void onRemoteStreamEnable(String userId, String hdLiveMediaCallRole)` | 远端流可用

##### 远端流不可用（多人连麦）

方法 | 注释
--- | ---
`void onRemoteStreamDisable(String userId)` | 远端流不可用

##### 邀请上麦（多人连麦）

方法 | 注释
--- | ---
`void onInviteCall()` | 邀请上麦

##### 取消邀请（多人连麦）

方法 | 注释
--- | ---
`void onInviteCanceled()` | 取消邀请

##### 音频状态改变（多人连麦）

方法 | 注释
--- | ---
`void onAudioStatusDidChange(String userId, boolean isAllowAudio, boolean isSelf)` | 音频状态改变

备注：主动更改音频状态，不会回调此方法

##### 视频状态改变（多人连麦）

方法 | 注释
--- | ---
`void onVideoStatusDidChange(String userId, boolean isAllowVideo, boolean isSelf)` | 视频状态改变

备注：主动更改视频状态，不会回调此方法

##### 被挂断（多人连麦）

方法 | 注释
--- | ---
`void onCallWasHangup()` | 被挂断

##### 连麦异常

方法 | 注释
--- | ---
`void onConnectionException(int code)` | 连麦异常

示例代码

    xxxxxxxxxxRTCConnectListener rtcConnectOutListener = new RTCConnectListener() {
            @Override        public void onInviteCall() {          //收到邀请        }
            @Override        public void onInviteCanceled() {          //收到取消邀请        }
            @Override        public void onCallWasHangup() {           //连麦被挂断        }
            @Override        public void onConnectionException(int code) {          //code(StreamErrorCode) -3：远端流失败；-4：rtc连接断开        }
            @Override        public void onRemoteStreamEnable(String userId, String role) {           //远端流可用        }
            @Override        public void onRemoteStreamDisable(String userId) {            //远端流不可用        }
            @Override        public void onMediaCallStatusDidChange(boolean isAllowSpeak, BaseRtcClient.RtcConnectType type) {            //连麦服务变更 isAllowSpeak：是否允许连麦；type：连麦类型（AUDIO、AUDIOVIDEO）        }
            @Override        public void onAudioStatusDidChange(String userid, boolean isAllowAudio, boolean isSelf) {            //音频状态改变        }
            @Override        public void onVideoStatusDidChange(String userid, boolean isAllowVideo, boolean isSelf) {            //视频状态改变        }    };

#### 直播间连麦相关接口 DWLiveListener

##### 连麦模式切换（多人连麦）

方法 | 注释
--- | ---
`public void onMediaCallModeDidChange(LiveStreamPlayMode.MODE mode)` | 连麦模式切换

##### 异常onException

ErrorCode | 注释
--- | ---
`ErrorCode.ROOM_SETTING_CHANGE` | 单人连麦切换多人连麦抛错
`ErrorCode.STREAM_ERROR` | 连麦视频流错误

#### 特别注意多人连麦在下述情况下需要退出房间重新登录

1. DWLiveListener回调onException时，errorCode是 `ErrorCode.ROOM_SETTING_CHANGE` 必须重新登录，是 `ErrorCode.STREAM_ERROR` 时如果需要重新发起连麦，必须要重新登录。