SDK 集成指南

为开发者集成音视频会话及相关高级功能提供相关指导,以下均为Java代码,详细代码请参考Examples目录下Demo源代码。

文档中“会议”和“会话”含义等同。

开始音视频会话

快速创建并进入一个简单的音视频会话;

请先准备[说明]中的相关内容: 1.运行环境要求, 2.开发环境配置以及连接相关的麦克风摄像头并确认设备工作正常。

基本步骤如下:

  1. 初始化SDK
  2. 登录连接视频服务器
  3. 创建视频会话
  4. 进入会话
  5. 打开麦克风/摄像头
  6. 有其他人进入会话
  7. 退出会话
  8. 注销登陆

1.初始化SDK

初始化是整个SDK的使用基础,通常在程序启动的时候进行初始化(init),退出的时候进行反初始化(uninit),整个程序的生命周期中只进行一次初始化和反初始化。

相关API参考请见 初始化/反初始化

SDK内部的组件多为单例组件,整个程序中只能有一个实例,比如“基础组件”,“会议管理组件”,“视频会议组件”,具体请参见各个组件说明。

    // 初始化SDK
    void initCloudroomVideoSDK() {
        // 输出SDK版本号
        String sdkVer = CloudroomVideoSDK.getInstance()
                .GetCloudroomVideoSDKVer();
        Log.d(TAG, "CloudroomVideoSDKVer:" + sdkVer);

        // SDK初始化数据对象
        SdkInitDat initDat = new SdkInitDat();
        // 会议Demo不需要呼叫队列功能
        initDat.noCall = true;
        initDat.noQueue = true;
        // 配置文件目录
        initDat.sdkDatSavePath = Environment.getExternalStorageDirectory()
                .getAbsolutePath() + "/MeetingDemo";
        // 初始化SDK
        CloudroomVideoSDK.getInstance().init(getApplicationContext(), initDat);
    }

2.登录连接视频服务器

设置视频服务器地址,使用云屋授权账号和自定义用户编号登录

相关API请参考 服务器地址登录/注销


    // 登陆操作
    private void doLogin(String server, String nickName, String privAcnt) {
        // 设置服务器地址
        CloudroomVideoSDK.getInstance().setServerAddr(server);

        // 登录数据对象
        LoginDat loginDat = new LoginDat();
        // 昵称
        loginDat.nickName = nickName;
        // 第三方账号
        loginDat.privAcnt = privAcnt;
        // 登录账号,使用开通SDK的账号
        loginDat.authAcnt = "demo@cloudroom.com";
        // 登录密码必须做MD5处理
        loginDat.authPswd = MD5Util.MD5("123456");
        // 执行登录操作
        CloudroomVideoMgr.getInstance().login(loginDat);
    }

3.创建视频会话

输入会议标题,创建一个没有密码的视频会话

相关API请参考 创建/销毁视频会议


    // 创建会议
    private void createMeeting(String subject) {
        if (TextUtils.isEmpty(subject)) {
            return;
        }
        // 创建会议
        CloudroomVideoMgr.getInstance().createMeeting(subject, false, TAG);

        enableOption(false);
    }

    // 创建会议成功
    private void onCreateMeetingSuccess(MeetInfo meetInfo, String cookie) {
        enterMeeting(meetInfo.ID, meetInfo.pswd);
    }

4.进入会话

用创建成功的会话信息(会议ID和密码)进入会话,其他用户也是利用此会话信息进入该会话。

相关API请参考 进入/退出/结束会议


    int meetID = getIntent().getIntExtra("meetID", 0);
    String password = getIntent().getStringExtra("password");
    if (meetID > 0) {
        VideoSDKHelper.getInstance().enterMeeting(meetID, password);
        mMainHandler.post(new Runnable() {
            @Override
            void run() {
                // TODO Auto-generated method stub
                showEntering();
            }
        });
    }

5.打开麦克风/摄像头

进入会话成功后,配置并打开自己的麦克风和摄像头

相关API请参考 麦克风/扬声器列表麦克风设置摄像头设备列表视频设置会议内可观看摄像头列表开/关摄像头视频状态获取/设置默认视频成员视频UI显示组件
相关结构定义请参考 音频配置用户视频信息

    // 成功进入会议
    private void onEnterMeeting() {
        String myUserID = CloudroomVideoMeeting.getInstance().getMyUserID();
        // 打开摄像头
        CloudroomVideoMeeting.getInstance().openVideo(myUserID);

        // 打开麦克风
        CloudroomVideoMeeting.getInstance().openMic(myUserID);

        // 开启外放
        CloudroomVideoMeeting.getInstance().setSpeakerOut(true);
    }

6.有其他人进入会话

其他人入会的步骤也是上述的[4、5]步,拿到会议信息后进入到他人创建的会议,此步骤的目的是为了实时关注比自己晚进来的人并刷新摄像头画面显示;如果想要获取之前进来的人,可以调用 getAllMembers 获取会议成员列表,也可以调用 getWatchableVideos 获取所有可以观看的摄像头列表进行加载。

成员视频UI显示组件创建多个视频窗口,来显示进入会议内的成员。

相关API请参考 有人进入/离开会议通知成员视频UI显示组件会议内可观看摄像头列表 相关结构定义请参考 用户视频信息

    //用户离开会议
    private void userEnterMeeting(String userid) {
        // 订阅视频
        watchVideos();
    }
    // 订阅视频
    private void watchVideos() {
        // 订阅可订阅的视频
        ArrayList<UsrVideoId> videos = CloudroomVideoMeeting.getInstance()
                .getWatchableVideos();

        String myUserId = CloudroomVideoMeeting.getInstance().getMyUserID();
        String peerUserId = VideoSDKHelper.getInstance().getPeerUserId();

        UsrVideoId[] wVideos = { null, null, null };
        ArrayList<UsrVideoId> watchVideos = new ArrayList<UsrVideoId>();
        for (UsrVideoId usrVideoId : videos) {
            if (usrVideoId.userId.equals(myUserId)) {
                wVideos[0] = usrVideoId;
                watchVideos.add(usrVideoId);
            } else if (usrVideoId.userId.equals(peerUserId)) {
                wVideos[1] = usrVideoId;
                watchVideos.add(usrVideoId);
            } else if (wVideos[2] == null) {
                wVideos[2] = usrVideoId;
                watchVideos.add(usrVideoId);
            }
        }
        mSelfGLSV.setUsrVideoId(wVideos[0]);
        mPeerGLSV.setUsrVideoId(wVideos[1]);
        mThirdGLSV.setUsrVideoId(wVideos[2]);

        CloudroomVideoMeeting.getInstance().watchVideos(watchVideos);
    }

至此,一个简单的音视频会话就建立起来了。

7.退出会话

在未注销的情况下可反复的进入退出同一个会议。

相关API请参考 进入/退出/结束会议


    // 离开会议
    CloudroomVideoMeeting.getInstance().exitMeeting();

8.注销登陆

可重复的登录和注销。

相关API请参考 进入/退出/结束会议登录/注销初始化/反初始化


    // 登录注销
    CloudroomVideoMgr.getInstance().logout();

9.反初始化,退出SDK

执行反初始化后SDK功能不再可用。

相关API请参考 初始化/反初始化


    // 反初始化SDK
    CloudroomVideoSDK.getInstance().uninit();

添加音视频会话功能

添加会议内的高级功能

音视频控制

进入会话后实现设备的加载、选择、设置

  1. 开关麦克风
  2. 监控麦克风状态变化
  3. 设置麦克风和扬声器音量
  4. 监控麦克风声音大小变化

1.开关麦克风

通过传入参数来控制开关的对象,如果是本地机器上的麦克风,需要传入自己的ID,如果要远程开关他人麦克风,则传入对方的ID


//打开自己的麦克风
String myUserID = CloudroomVideoMeeting.getInstance().getMyUserID();
CloudroomVideoMeeting.getInstance().openMic(myUserID);
//关闭自己的麦克风
String myUserID = CloudroomVideoMeeting.getInstance().getMyUserID();
CloudroomVideoMeeting.getInstance().closeMic(myUserID);

2.监控麦克风状态变化

1. 开关自己或他人的的麦克风都会收到该回调函数
2. 自己的麦克风被他人开关也会收到该回调函数
3. 也可主动获取麦克风状态,一般用于各种判断

    // 设置会议回调(会议视频)
    CloudroomVideoMeeting.getInstance().registerCallback(mMeetingCallback);

    //音频状态发生变化
    @Override
    void audioStatusChanged(final String userID,
            final ASTATUS oldStatus, final ASTATUS newStatus) {
        // TODO Auto-generated method stub
        //...
    }

3.设置麦克风和扬声器音量


    //由系统调节麦克风和扬声器的声音
    setVolumeControlStream(AudioManager.STREAM_VOICE_CALL);

4.监控麦克风声音变化

可用来实时展示当前麦克风采集到声音的大小

    // 设置会议回调(会议视频)
    CloudroomVideoMeeting.getInstance().registerCallback(mMeetingCallback);

    //麦克风音量波动
    @Override
    void micEnergyUpdate(String userID, int oldLevel, int newLevel) {
        // TODO Auto-generated method stub
        String myUserID = CloudroomVideoMeeting.getInstance().getMyUserID();
        if (userID.equals(myUserID))
        {
            //更新音量进度条
        }
        else
        {
            // ...
        }
    }

本地录制

  1. 创建混图器
  2. 添加输出到录像文件
  3. 录像文件事件处理
  4. 更新图像内容
  5. 结束

1.创建混图器

API请参考:createLocMixer

    //混图器编号
    String mixerID = "1";

    MixerCfg mixerCfg = new MixerCfg();
    mixerCfg.defaultQP = 26;
    mixerCfg.frameRate = 15;
    mixerCfg.bitRate = setCfg.bitRate;
    mixerCfg.dstResolution = new Size(640, 360);
    // 图像内容
    ArrayList<MixerContent> contents = new ArrayList<MixerContent>();
    // 视频大小
    int recWidth = mixerCfg.dstResolution.width;
    int recHeight = mixerCfg.dstResolution.height;
    Rect videoRect = new Rect(0, 0, recWidth, recHeight);
    // 自己的摄像头
    String myUserID = CloudroomVideoMeeting.getInstance().getMyUserID();
    short camID = CloudroomVideoMeeting.getInstance().getDefaultVideo(
            myUserID);
    MixerContent videoItem = MixerContent.createVideoContent(myUserID, camID,
            videoRect);
    videoItem.bKeepAspectRatio = true;
    // 添加到内容列表
    contents.add(videoItem);
    // 创建混图器
    CRVIDEOSDK_ERR_DEF errCode = CloudroomVideoMeeting.getInstance().createLocMixer(mixerID, mixerCfg, contents);
    if (errCode != CRVIDEOSDK_ERR_DEF.CRVIDEOSDK_NOERR) {
        //出错
    }
    else
    {
        //成功
    }

2.添加输出到录像文件

API请参考:addLocMixerOutput

    //混图器编号
    String mixerID = "1";
    MixerOutPutCfg outputCfg = new MixerOutPutCfg();
    outputCfg.type = MIXER_OUTPUT_TYPE.MIXOT_FILE;
    // 设置录制文件是否加密
    outputCfg.encryptType = 0;
    // 录制文件名称
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss");
    Date date = new Date(System.currentTimeMillis());
    outputCfg.fileName = String.format("/sdcard/%s_Android.mp4", format.format(date));
    ArrayList<MixerOutPutCfg> cfgs = new ArrayList<MixerOutPutCfg>();
    cfgs.add(outputCfg);
    CRVIDEOSDK_ERR_DEF errCode = CloudroomVideoMeeting.getInstance().addLocMixerOutput(mixerID, cfgs);
    if (errCode != CRVIDEOSDK_ERR_DEF.CRVIDEOSDK_NOERR) {
        //出错
    }
    else
    {
        //成功
    }

3.录像文件事件处理

  • 在此可获得录像文件的时长、大小、录像文件异常等信息

事件请参考:locMixerOutputInfo


    void locMixerOutputInfo(String mixerID, String nameOrUrl, MixerOutputInfo info)
    {
        if ( info.state==MIXER_OUTPUT_STATE.OUTPUT_ERR )
        {
            //录像文件出错,info.errCode中有错误原因
        }
        else
        {
            //可以得到文件时长、大小
        }
    }

4.更新图像内容

API请参考:updateLocMixerContent

    //混图器编号
    String mixerID = "1";

    // 图像内容
    ArrayList<MixerContent> contents = new ArrayList<MixerContent>();
    // 视频大小
    int recWidth = mixerCfg.dstResolution.width;
    int recHeight = mixerCfg.dstResolution.height;
    Rect videoRect = new Rect(0, 0, recWidth, recHeight);
    // 自己的摄像头
    String myUserID = CloudroomVideoMeeting.getInstance().getMyUserID();
    short camID = CloudroomVideoMeeting.getInstance().getDefaultVideo(
            myUserID);
    MixerContent videoItem = MixerContent.createVideoContent(myUserID, camID,
            videoRect);
    videoItem.bKeepAspectRatio = true;
    // 添加到内容列表
    contents.add(videoItem);
    // 更新图像内容
    CRVIDEOSDK_ERR_DEF errCode = CloudroomVideoMeeting.getInstance().updateLocMixerContent(mixerID, contents);
    if (errCode != CRVIDEOSDK_ERR_DEF.CRVIDEOSDK_NOERR) {
        //出错
    }
    else
    {
        //成功
    }

5.结束

API请参考:destroyLocMixer


    //混图器编号
    String mixerID = "1";

    //消毁混图器, 各输出自动结束
    CloudroomVideoMeeting.getInstance().destroyLocMixer(mixerID);

本地直播

  1. 创建混图器
  2. 添加直播推流
  3. 直播推流事件处理
  4. 更新图像内容
  5. 结束

1.创建混图器

API请参考:createLocMixer

    //混图器编号
    String mixerID = "1";

    MixerCfg mixerCfg = new MixerCfg();
    mixerCfg.defaultQP = 26;
    mixerCfg.frameRate = 15;
    mixerCfg.bitRate = setCfg.bitRate;
    mixerCfg.dstResolution = new Size(640, 360);
    // 图像内容
    ArrayList<MixerContent> contents = new ArrayList<MixerContent>();
    // 视频大小
    int recWidth = mixerCfg.dstResolution.width;
    int recHeight = mixerCfg.dstResolution.height;
    Rect videoRect = new Rect(0, 0, recWidth, recHeight);
    // 自己的摄像头
    String myUserID = CloudroomVideoMeeting.getInstance().getMyUserID();
    short camID = CloudroomVideoMeeting.getInstance().getDefaultVideo(
            myUserID);
    MixerContent videoItem = MixerContent.createVideoContent(myUserID, camID,
            videoRect);
    videoItem.bKeepAspectRatio = true;
    // 添加到内容列表
    contents.add(videoItem);
    // 创建混图器
    CRVIDEOSDK_ERR_DEF errCode = CloudroomVideoMeeting.getInstance().createLocMixer(mixerID, mixerCfg, contents);
    if (errCode != CRVIDEOSDK_ERR_DEF.CRVIDEOSDK_NOERR) {
        //出错
    }
    else
    {
        //成功
    }

2.添加直播推流

API请参考:addLocMixerOutput


    //混图器编号
    String mixerID = "1";
    //推流到A,B两个直播平台
    ArrayList<MixerOutPutCfg> cfgs = new ArrayList<MixerOutPutCfg>();

    // A直播平台
    MixerOutPutCfg outputCfg = new MixerOutPutCfg();
    outputCfg.type = MIXER_OUTPUT_TYPE.MIXOT_LIVE;
    outputCfg.liveUrl = "rtmp://A/xxx";
    cfgs.add(outputCfg);

    // A直播平台
    outputCfg = new MixerOutPutCfg();
    outputCfg.type = MIXER_OUTPUT_TYPE.MIXOT_LIVE;
    outputCfg.liveUrl = "rtmp://A/xxx";
    cfgs.add(outputCfg);

    CRVIDEOSDK_ERR_DEF errCode = CloudroomVideoMeeting.getInstance().addLocMixerOutput(mixerID, cfgs);
    if (errCode != CRVIDEOSDK_ERR_DEF.CRVIDEOSDK_NOERR) {
        //出错
    }
    else
    {
        //成功
    }

3.直播推流事件处理

  • 在此可获得推流的时长、数据大小、异常等信息

事件请参考:locMixerOutputInfo


    void locMixerOutputInfo(String mixerID, String nameOrUrl, MixerOutputInfo info)
    {
        if ( info.state==MIXER_OUTPUT_STATE.OUTPUT_ERR )
        {
            //推流出错,info.errCode中有错误原因
        }
        else
        {
            //可以得到时长、大小
        }
    }

4.更新图像内容

API请参考:updateLocMixerContent


    //混图器编号
    String mixerID = "1";
    // 图像内容
    ArrayList<MixerContent> contents = new ArrayList<MixerContent>();
    // 视频大小
    int recWidth = mixerCfg.dstResolution.width;
    int recHeight = mixerCfg.dstResolution.height;
    Rect videoRect = new Rect(0, 0, recWidth, recHeight);
    // 自己的摄像头
    String myUserID = CloudroomVideoMeeting.getInstance().getMyUserID();
    short camID = CloudroomVideoMeeting.getInstance().getDefaultVideo(
            myUserID);
    MixerContent videoItem = MixerContent.createVideoContent(myUserID, camID,
            videoRect);
    videoItem.bKeepAspectRatio = true;
    // 添加到内容列表
    contents.add(videoItem);

    CRVIDEOSDK_ERR_DEF errCode = CloudroomVideoMeeting.getInstance().updateLocMixerContent(mixerID, contents);
    if (errCode != CRVIDEOSDK_ERR_DEF.CRVIDEOSDK_NOERR) {
        //出错
    }
    else
    {
        //成功
    }

5.结束

API请参考:destroyLocMixer


    //混图器编号
    String mixerID = "1";

    //消毁混图器, 各输出自动结束
    CloudroomVideoMeeting.getInstance().destroyLocMixer(mixerID);

影音播放共享

  1. 引入影音播放UI显示组件
  2. 播放配置
  3. 播放、暂停、停止
  4. 设置播放进度
  5. 文件列表、播放信息、播放音量

1.引入影音播放UI显示组件

使用可视化UI组件进行影音播放
    <com.cloudroom.cloudroomvideosdk.MediaUIView
        android:id="@+id/yuv_media"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="fitCenter" />

2.播放配置

此配置主要是为了定义共享播放时会议内其他人看到的效果
VideoCfg cfg = new VideoCfg();
cfg.sizeType = VIDEO_SIZE_TYPE.VSIZE_SZ_360;
cfg.fps = 20;           //帧率
cfg.qp_min = 22;        //
cfg.qp_max = 36;        //流畅优先
CloudroomVideoMeeting.getInstance().setMediaCfg(cfg);

3.播放、暂停、停止

每次只能播放一个视频,当前播放需要先停止然后才能进行下一个视频播放;
开始播放参数可控制此播放是只有自己可见还是会议内所有人可见。
//开始播放
CloudroomVideoMeeting.getInstance().startPlayMedia("/sdcard/RecordDemo/CloudroomVideoSDK/4.mp4", true);
//暂停播放
CloudroomVideoMeeting.getInstance().pausePlayMedia(false);
//继续播放
CloudroomVideoMeeting.getInstance().pausePlayMedia(true);
//停止当前播放
CloudroomVideoMeeting.getInstance().stopPlayMedia();

4.设置播放进度

可以通过播放组件上的工具条拖动来调整播放进度,也可以用代码来设置播放的进度
int pos = 123456;
CloudroomVideoMeeting.getInstance().setMediaPlayPos(pos);

5.文件列表、播放信息、播放音量

//获取media目录下的所有影音文件
ArrayList<String> mediaFiles = CloudroomVideoMeeting.getInstance().getAllFilesInMediaPath();
//获取当前播放的影音文件信息
MediaInfo mediaInfo = CloudroomVideoMeeting.getInstance().getMediaInfo();
//设置当前播放的影音声音
int vol = 24;
CloudroomVideoMeeting.getInstance().setMediaVolume(vol);

屏幕共享

1.引入共享UI显示组件

使用可视化UI组件进行屏幕共享显示和操作
    <com.cloudroom.cloudroomvideosdk.ScreenShareUIView
        android:id="@+id/view_screenshare"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:clickable="true"/>

2.观看共享

收到回调共享启动,出现共享内容显示组件,观看共享使用标准。
    // 设置会议回调(会议视频)
    CloudroomVideoMeeting.getInstance().registerCallback(mMeetingCallback);
    //对方启动屏幕共享
    @Override
    void notifyScreenShareStarted() {
        // TODO Auto-generated method stub
        // ...
    }
    //对方关闭屏幕共享
    @Override
    void notifyScreenShareStopped() {
        // TODO Auto-generated method stub
        // ...
    }

聊天

实现会话内文本聊天,如果需要更加丰富的聊天内容,可自己传输文本格式,并进行相关解析

    // 设置会议回调(会议视频)
    CloudroomVideoMeeting.getInstance().registerCallback(mMeetingCallback);
//发送IM信息
string userID = "user_00005"; //为空时表示广播,发给所有人
CloudroomVideoMeeting.getInstance().sendIMmsg(txtMsg.Text, userID, "");
    //发送结果
    @Override
    void sendIMmsgRlst(String taskID, CRVIDEOSDK_ERR_DEF sdkErr,
            String cookie) {
        // TODO Auto-generated method stub
        // ...
    }
    //收到IM消息
    @Override
    void notifyIMmsg(String fromUserID, String text, int sendTime) {
        // TODO Auto-generated method stub
        // ...
    }

参会成员管理

获取会话内人员及相关信息,得到成员的userID后可以对其进行相关的远程音视频操作

//获取所有参会人
ArrayList<MemberInfo> members = CloudroomVideoMeeting.getInstance().getAllMembers();
//获取某个参会人的信息
MemberInfo memInfo = CloudroomVideoMeeting.getInstance().getMemberInfo("user_00005");

功能页同步

用户会话内同步所有人的功能,包括视频墙、影音共享、屏幕共享、电子白板

//切换功能页
CloudroomVideoMeeting.getInstance().switchToPage(MAIN_PAGE.MAINPAGE_VIDEOWALL, null);
// 设置会议回调(会议视频)
CloudroomVideoMeeting.getInstance().registerCallback(mMeetingCallback);
    //当他人切换功能页时,收到通知消息
    @Override
    void notifySwitchToPage(MAIN_PAGE main, SubPage sub) {
        // ...
    }

队列管理

利用队列功能,实现用户分配。使用队列时通常会有两种角色,坐席和客户,队列模块把排队的客户分配给某个服务队列的坐席。

组件介绍请参考 队列管理组件

  1. 初始化队列,获取队列数据
  2. 坐席队列操作
  3. 坐席请求用户
  4. 系统自动给坐席分配用户
  5. 客户排队操作

1.初始化队列,获取队列数据

在登录成功后初始化队列数据
// 设置队列回调
CloudroomQueue.getInstance().registerCallback(mQueueCallback);
//可在登录成功后初始化队列数据
private void onLoginSuccess() {
    // 初始化专家坐席用户队列
    CloudroomQueue.getInstance().initQueue("");
}
    //队列初始化响应
    @Override
    void initQueueDatRslt(CRVIDEOSDK_ERR_DEF sdkErr, String cookie) {
        // TODO Auto-generated method stub
        // ...
    }

2.坐席队列操作

坐席角色开始和停止服务队列,以及操作后队列状态的变化
//开始服务队列
CloudroomQueue.getInstance().startService(queID, "");
//停止服务队列
CloudroomQueue.getInstance().stopService(queID, "");
//获取服务的所有队列
ArrayList<Integer> queIDs = CloudroomQueue.getInstance().getServingQueues();
// 设置队列回调
CloudroomQueue.getInstance().registerCallback(mQueueCallback);
    //开始队列服务结果
    @Override
    void startServiceRslt(int queID, CRVIDEOSDK_ERR_DEF sdkErr,
            String cookie) {
        // TODO Auto-generated method stub
        // ...
    }
    //停止队列服务结果
    @Override
    void stopServiceRslt(int queID, CRVIDEOSDK_ERR_DEF sdkErr,
            String cookie) {
        // TODO Auto-generated method stub
        // ...
    }
    //队列状态变化通知
    @Override
    void queueStatusChanged(QueueStatus queStatus) {
        // TODO Auto-generated method stub
        // ...
    }

3.坐席请求用户

在设置DND免打扰状下态,系统不再自动分配,需要手动申请用户
// 设置队列回调
CloudroomQueue.getInstance().registerCallback(mQueueCallback);
//设置免打扰状态,关掉系统自动推送
CloudroomVideoMgr.getInstance().setDNDStatus(1, "");
//手动请求一个用户
CloudroomQueue.getInstance().reqAssignUser("");
    //请求用户的结果
    @Override
    void reqAssignUserRslt(CRVIDEOSDK_ERR_DEF sdkErr, UserInfo usr,
            String cookie) {
        // TODO Auto-generated method stub
        if (sdkErr == CRVIDEOSDK_ERR_DEF.CRVIDEOSDK_NOERR)
        {
            // 请求用户成功
        }
        else if(sdkErr == CRVIDEOSDK_ERR_DEF.CRVIDEOSDK_QUE_NOUSER)
        {
            // 队列中没有排队人员
        }
        else
        {
           // 手动请求用户失败,代码:sdkErr
        }
    }
//取消免打扰,开启系统自动推送
CloudroomVideoMgr.getInstance().setDNDStatus(0, "");

4.系统自动给坐席分配用户

系统自动分配的用户在坐席还未选择接受或拒绝时,系统可以撤回分配
// 设置队列回调
CloudroomQueue.getInstance().registerCallback(mQueueCallback);
    //系统自动分配用户通知
    @Override
    void autoAssignUser(UserInfo usr) {
        // TODO Auto-generated method stub
        //...
    }
//接受或拒绝分配的用户操作响应
@Override
    void responseAssignUserRslt(CRVIDEOSDK_ERR_DEF sdkErr, String cookie) {
        // TODO Auto-generated method stub
        //...
    }
    //系统撤回分配此用户通知
    @Override
    void cancelAssignUser(int queID, String usrID) {
        // TODO Auto-generated method stub
        //取消分配用户的弹框
    }

5.客户排队操作

客户选择一个队列进行排队,每次只能排一个队列
// 设置队列回调
CloudroomQueue.getInstance().registerCallback(mQueueCallback);
//开始排队
int queID = 1;
CloudroomQueue.getInstance().startQueuing(queID, "");
//停止排队
CloudroomQueue.getInstance().stopQueuing("");
    //开始排队结果
    @Override
    void startQueuingRslt(CRVIDEOSDK_ERR_DEF sdkErr, String cookie) {
        // TODO Auto-generated method stub
        if (sdkErr != CRVIDEOSDK_ERR_DEF.CRVIDEOSDK_NOERR) //开始排队失败
        {
            // ....
        }
    }
    //停止排队结果
    @Override
    void stopQueuingRslt(CRVIDEOSDK_ERR_DEF sdkErr, String cookie) {
        // TODO Auto-generated method stub
        //……
    }
    //队列状态变化通知
    @Override
    void queueStatusChanged(QueueStatus queStatus) {
        // TODO Auto-generated method stub
        //……
    }
    //排队信息更新
    @Override
    void queuingInfoChanged(QueuingInfo queuingInfo) {
        // TODO Auto-generated method stub
        //……
    }

呼叫他人

实现用户到用户的呼叫,以此来实现会话信息的分发以及相关信息的传递

  1. 主叫
  2. 被叫

1.主叫

呼叫发起方
// 设置管理回调(账号登陆、会议管理、呼叫管理)
CloudroomVideoMgr.getInstance().registerCallback(mMgrCallback);
//开始呼叫,meetInfo为之前创建的会议对象
string userID = "user_000007";
string callID = CloudroomVideoMgr.getInstance().call(userID, meetInfo, "", "");
//挂断呼叫
CloudroomVideoMgr.getInstance().hungupCall(callID, "", "");
    //呼叫成功发出,等待对方响应
    @Override
    void callSuccess(String callID, int meetID, String meetPswd, String cookie) {
           //...
    }
    //呼叫发出失败
    @Override
    void callFail(String callID, final CRVIDEOSDK_ERR_DEF sdkErr,
            String cookie) {
        // TODO Auto-generated method stub
        // 呼叫失败,代码: sdkErr
    }
    //我的呼叫被对方接受,得到会议对象,可以进入会议
    @Override
    void notifyCallAccepted(String callID, MeetInfo meetInfo, String useExtDat) {
        CloudroomVideoMeeting.getInstance().enterMeeting(meetInfo.ID, meetInfo.pswd, MyUserId, MyNickname, "");
        //打开会话界面……
    }
    //我的呼叫被对方拒绝
    @Override
    void notifyCallRejected(String callID, final CRVIDEOSDK_ERR_DEF reason, final String useExtDat) {
        //被拒绝了 o.o ……
    }

2.被叫

被呼叫方
// 设置管理回调(账号登陆、会议管理、呼叫管理)
CloudroomVideoMgr.getInstance().registerCallback(mMgrCallback);
//有呼叫进入
    @Override
    void notifyCallIn(String callID, MeetInfo meetInfo,
            String callerID, String param) {
        if(/*接受呼叫, 进入会议*/)
        {
            CloudroomVideoMgr.getInstance().acceptCall(callID, meetInfo, "", "");
            CloudroomVideoMeeting.getInstance().enterMeeting(meetInfo.ID, meetInfo.pswd, MyUserId, MyNickname, "");
            //打开会话界面……
        }
        else //拒绝对方的呼叫
        {
            CloudroomVideoMgr.getInstance().rejectCall(callID, "", "", "");
        }
    }

透明传输

独立于会话的传输功能,对SDK透明,发送对象必须要先成功登录

  1. 发送命令、文本、文件
  2. 收到命令、数据、文件

1.发送命令、文本、文件

小数据走命令接口,大数据走文本接口,命令的发送不可以被取消,也没有进度通知
//发送命令和数据,小数据走sendcmd接口,大数据走sendbuffer接口,字符串可以直接发送,字节数组建议使用Base64编码成String发送防止有不支持的字符,注意:各个平台必须统一,使用Base64编码之后发送的收到之后也必须使用Base64解码
CloudroomVideoMgr.getInstance().sendCmd(userID, "data");
CloudroomVideoMgr.getInstance().sendBuffer(userID, Base64.encodeToString(input, Base64.DEFAULT););
//发送文件
String userID = "user_000022";
String fileName = "/sdcard/a.jpg";
String mFileTaskID = CloudroomVideoMgr.getInstance().sendFile(userID, mSelectedFile);
//取消发送
CloudroomVideoMgr.getInstance().cancelSend(mFileTaskID);
// 设置管理回调
CloudroomVideoMgr.getInstance().registerCallback(mMgrCallback);
    //发送大数据和文件的进入通知
    @Override
    void sendProgress(String sendId, int sendedLen, int totalLen,
            String cookie) {
        // TODO Auto-generated method stub
        string text = "总大小:" + totalLen + ", 已发送" + sendedLen;
        //发完了
        if (sendedLen == totalLen)
        {
            //发送成功
        }
    }
    //发送命令结果
    @Override
    void sendCmdRlst(String sendId, CRVIDEOSDK_ERR_DEF sdkErr,
            String cookie) {
        // TODO Auto-generated method stub
        if (sdkErr != 0)
        {
            mBufferTaskID = "";
            //发送失败: sdkErr
        }
    }
    //发送数据结果
    @Override
    void sendBufferRlst(String sendId, CRVIDEOSDK_ERR_DEF sdkErr,
            String cookie) {
        // TODO Auto-generated method stub
        if (sdkErr != 0)
        {
            mBufferTaskID = "";
            //发送失败: sdkErr
        }
    }
    //发送文件结果
    @Override
    void sendFileRlst(String sendId, String fileName, CRVIDEOSDK_ERR_DEF sdkErr,
            String cookie) {
        // TODO Auto-generated method stub
        if (sdkErr != 0)
        {
            mBufferTaskID = "";
            //发送失败: sdkErr
        }
    }
    //取消发送的结果
    @Override
    void cancelSendRlst(String sendId, CRVIDEOSDK_ERR_DEF sdkErr,
            String cookie) {
        // TODO Auto-generated method stub
        if (sdkErr != 0)
        {
           //取消发送失败"
        }
    }

2.收到命令、数据、文件

收到别人发送数据的通知
// 设置管理回调
CloudroomVideoMgr.getInstance().registerCallback(mMgrCallback);
    //收到命令
    @Override
    void notifyCmdData(String sourceUserId, String data) {
        // TODO Auto-generated method stub
        //...
    }
    //收到大数据
    @Override
    void notifyBufferData(String sourceUserId, String data) {
        // TODO Auto-generated method stub
        //...
    }
    //收到文件
    @Override
    void notifyFileData(String sourceUserId, String tmpFile,
            String orgFileName) {
        // TODO Auto-generated method stub
        //...
    }
© HeDonghai all right reserved,powered by Gitbook文件修订时间: 2018-12-01 16:47:12

results matching ""

    No results matching ""