本章将介绍如何实现多方语音通话,多方语音通话的 API 调用时序见下图:
 
初始化
调用 JCMediaDevice.create() 和 JCMediaChannel.create() 以初始化实现多方通话需要的模块::
// 声明对象
JCMediaDevice mMediaDevice;
JCMediaChannel mMediaChannel;
// 初始化函数
public boolean initialize(Context context) {
    //1. 媒体类
    mMediaDevice = JCMediaDevice.create(mClient, new JCMediaDeviceCallback() {
        @Override
        public void onCameraUpdate() {
        }
        @Override
        public void onAudioOutputTypeChange(int i) {
        }
        @Override
        public void onRenderReceived(JCMediaDeviceVideoCanvas jcMediaDeviceVideoCanvas) {
        }
        @Override
        public void onRenderStart(JCMediaDeviceVideoCanvas jcMediaDeviceVideoCanvas) {
        }
    });
    // 2. 媒体通道类
    mMediaChannel = JCMediaChannel.create(client, mediaDevice, new JCMediaChannelCallback() {
        @Override
        public void onMediaChannelStateChange(int i, int i1) {
        }
        @Override
        public void onMediaChannelPropertyChange(JCMediaChannel.PropChangeParam propChangeParam) {
        }
        @Override
        public void onJoin(boolean b, int i, String s) {
        }
        @Override
        public void onLeave(int i, String s) {
        }
        @Override
        public void onStop(boolean b, int i) {
        }
        @Override
        public void onQuery(int i, boolean b, int i1, JCMediaChannelQueryInfo jcMediaChannelQueryInfo) {
        }
        @Override
        public void onParticipantJoin(JCMediaChannelParticipant jcMediaChannelParticipant) {
        }
        @Override
        public void onParticipantLeft(JCMediaChannelParticipant jcMediaChannelParticipant) {
        }
        @Override
        public void onParticipantUpdate(JCMediaChannelParticipant jcMediaChannelParticipant, JCMediaChannelParticipant.ChangeParam changeParam) {
        }
        @Override
        public void onMessageReceive(String s, String s1, String s2) {
        }
        @Override
        public void onInviteSipUserResult(int i, boolean b, int i1) {
        }
        @Override
        public void onParticipantVolumeChange(JCMediaChannelParticipant jcMediaChannelParticipant) {
        }
    });
}
加入频道
- 调用 enableUploadAudioStream() 开启音频流。 - // 1. 开启音频流 mMediaDeviceChannel.enableUploadAudioStream(true); 
- 创建并加入频道,需要传入 - channelIdOrUri和 JCMediaChannel.JoinParam 。- channelIdOrUri表示频道 ID 或频道 Uri。
- JCMediaChannelJoinParam中- uriMode参数设置为 true 时表示传入频道 Uri,设置其他参数时表示传入频道 ID。传入相同的频道 ID 或相同的频道 Uri 的用户会进入同一个频道。
 - mMediaChannel.join("222", null); 
- 加入频道后收到 onJoin() 回调。 - @Override public void onJoin(boolean result, @JCMediaChannel MediaChannelReason int reason, String channelId) { if (result) { // 加入频道成功 } else { // 加入频道失败 } } 
离开频道
调用 leave() 方法可以离开当前频道。
mMediaChannel.leave();
在多方视频通话中,离开频道还需要调用 stopVideo() 移除视频画面。
mParticipant.stopVideo();
离开频道后,自身收到 onLeave() 回调,其他成员同时收到 onParticipantLeft() 回调。
解散频道
如果想解散频道,可以调用下面的接口,此时所有成员都将被退出。
// 结束频道
mMediaChannel.stop();
在多方视频通话中,离开频道还需要调用 stopVideo() 移除视频画面。
mParticipant.stopVideo();
解散频道后,发起结束的成员收到 onStop() 回调,其他成员同时收到 onLeave() 回调。 解散失败原因枚举值请参考 MediaChannelReason 。
@Override
public void onStop(boolean result, @JCMediaChannel.MediaChannelReason int reason) {
    // 销毁视频, canvas 为 JCMediaDeviceVideoCanvas 对象实例
    mParticipant.stopVideo();
    canvas = null;
}
