1 SDK概述

Android容能云SDK提供了基于 Android系统 的 IM通信,用户资料托管,公司组织架构托管,音视频通话等功能。还提供了UISdk和demo

功能演示各Sdk使用。建议在demo的基础上进地使用. Demo和UISdk代码是开放源码,可以自由修改。

注:IM SDK 最低支持 Android 4.0, 音视频通话功能最低支持Android 4.1


2 前期准备

2.1 下载SDK

进入容能官网下载sdk

名称功能依赖
libsecurity.so加解密库
libspeex.so音频编解码库
llibmobileavprocessor.so音视频实时通话
comSdk.jar基础库libsecurity.so
mcSdk.jar消息中心comSdk
imSdk.jarIM通讯功能库mcSdk,comSdk,libspeex
userSdk.jar用户资料,用户关系,公司关系库mcSdk,comSdk
mediaSdk.jar音视频实时通话mcSdk,comSdk,   llibmobileavprocessor.so
pushSdk.jar第三方消息推送comSdk


image.png


    说明:

          libsecurity.so : 加密库

          libspeex.so: 音频编解码库

          libmobileavprocessor.so: 音视频实时通话库

          comSdk:容能Sdk的基础库

          mcSdk:消息中心,用于其他能力提供实时推送功能,如用户资料变化,好友申请,音视频发起等通知

          imSdk:IM通讯功能,包含消息收发,消息列表,群组管理等接口

          userSdk: 用户资料能力,包含用户资料,好友关系,黑名单,公司组织架构,员工资料等数据操作接口

          mediaSdk:提供了音视频实时通话功能

          pushSdk:提供了第三方消息推送支持,目前支持小米推送、华为推送,需要开发者自行导入对应sdk到app project中

 

    注:各SDK可以按实际需求进行组合. 

        √  如果只要IM能力 需要comSdk.jar+mcSdk.jar+imSdk.jar+libsecurity.so+libspeex.so

        √  如果需要增加用户资料托管能力需要  userSdk.jar

        √  如果需要音视频通话能力需要  mediaSdk.jar+libmobileavprocessor.so

        √  用户资料托管能力和音视通话能力可以脱离IM能力独立使用

        √  目前各sdk会依赖mcSdk

2.2 配置工程

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.GET_TASKS"/>
<uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.CALL_PHONE"/>
<uses-permission android:name="android.permission.RECEIVE_USER_PRESENT"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="andFroid.permission.SYSTEM_ALERT_WINDOW"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>


2.3 添加相关组件

<!-- 容能云配置 START -->

<!-- 进程间通信,需要在主进程上 -->
<receiver android:name="cn.ipower.android.cloudsdk.com.service.RnReceiver" />

<!-- IM后台服务 -->
<service
    android:name="cn.ipower.android.cloudsdk.com.conn.lib.SdkService"
    android:process=":core" />

<!-- MC后台服务 -->
<service
    android:name="cn.ipower.android.cloudsdk.com.conn.lib.McService"
    android:process=":core" />

<!-- AV后台服务 -->
<service
    android:name="cn.ipower.android.cloudsdk.media.lib.AVService"
    android:process=":core" />

<!-- App AppId和AppKey配置 -->
<meta-data
    android:name="RN_AppId"
    android:value="${RN_AppId}" />
<meta-data
    android:name="RN_AppKey"
    android:value="${RN_AppKey}" />

<activity
    android:name=".DemoMainActivity"
    android:launchMode="singleTask"
    android:screenOrientation="portrait"
    android:theme="@style/RNTheme.NoActionBar"
    android:windowSoftInputMode="stateHidden|adjustPan">
    <!-- APP主界面 Action, 用于某些场景跳转到主界面 -->
    <intent-filter>
        <action android:name="${AppPackageName}.ACTION.MAIN" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>

    <!-- APP主界面 Action, 用于从聊天界面跳转到联系人列表页面 -->
    <intent-filter>
        <action android:name="${AppPackageName}.ACTION.RECENT_SESSION" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>
<!-- 容能云配置 END -->


2.4 SDK初始化

初始化在Application的onCreate处调用

/**
 * OnCreate 会被多个进程重入,这段保护代码,在主进程调用init。
 */
if (inMainProcess()) {
    AuthInfo authInfo = getAuthInfo();
    UserPreferences.init(getApplicationContext(), authInfo == null ? "" : authInfo.getUserId());
    IMSDKOptions imsdkOptions = getOptions();

    //初始化第三方推送,必须在im和mc之前,因为这2个模块有依赖,如果不使用第三方推送,不需调用
    //init会根据系统类型选择对应的推送服务启动,如果系统类型不支持小米/华为推送,则第三方推送启用失败,
    PushSetting.registeMiPush("2882303761517577822","5891757730822");//注册小米推送信息
    PushSetting.registeHwPush();//注册华为推送信息
    PushClient.init(this);

    //必须在各个lib之前init,因为其他lib有对MCLib引用
    MCLib.init(this, authInfo, null, new MCLib.Callback() {
        @Override
        public void onInit() {
    log.i("onInit MCLib....");
        }
    });

    log.i("Initializing ImLib....");
    // 初始化IM
    IMLib.init(this, authInfo, imsdkOptions, new IMLib.Callback() {
        @Override
        public void onInit() {
    log.i("onInit ImLib....");
        }
    });
    // 初始化音视频通话
    MediaLib.init(this, authInfo,new MediaLib.Callback() {
        @Override
        public void onInit() {
    log.i("onInit MediaLib....");
            MediaLib.getInstance().getMediaManager().setDebugLogEnable(false);
        }
    });
    // 初始化用户关系及资料
    UserLib.init(this, authInfo, new UserLib.Callback() {
        @Override
        public void onInit() {
    log.i("onInit UserLib....");
        }
    });


    IMLib.getInstance().getAuthManager().registerConnStatusObserver(new Observer<StatusCode>() {
        @Override
        public void onEvent(StatusCode paramT) {
            if(StatusCode.LOGINED == paramT){
                PushClient.getInstance().login(DemoApplication.this,IMLib.getInstance().
                getAuthManager().getAuthInfo());
            }else if(StatusCode.LOGOUT == paramT){
                PushClient.getInstance().logout(DemoApplication.this);
            }
        }
    });

    // UISDK 初始化需要在各库初始化之后
    UISdk.init(this, authInfo);
    UISdk.setIsCompany(SpHelper.getIsCompany());
    ImageLoaderUtil.getInstance().initImageLoaderConfig(this, StorageUtil.getCacheDir(this, 
                DirType.IMAGE));
}


3 用户登录与登出

容能云提供用户托管和非托管服务.详见:TODO:

全托管:

非托管:

登录时需要userId和token 


3.1 手动登录

1. Token获取

全托管用户需要调用帐号密码登录获取 token和userId,

UserLib.getInstance().getAuthManager().login(userName, password);

半托管用户需要App从自己的AppServer获取userId和token  (TODO:AppServer获取 token方式参见)非托管用户鉴权

UserLib.getInstance().getAuthManager().login(authInfo);

各Sdk都有依赖McSdk,所以登录时同时需要登录MC

MCLib.getInstance().getAuthManager().login(authInfo);

监听MC登录状态

MCLib.getInstance().getAuthManager().registerConnStatusObserver(sConnObserver);
    Observer sConnObserver = new Observer@Override
     public void onEvent(StatusCode statusCode) {
         switch (statusCode) {
             case INVALID:
             case UNLOGIN:
             case NET_BROKEN:
             case CONNECTING:
             case LOGINING:
             case LOGINED:  
             case FORBIDDEN:
             case VER_ERROR:  
             case AUTH_ERROR:  
                 
                 break;
         }
     }
 };

使用IMAuthManager登录 IM

mIMAuthManger = IMLib.getInstance().getAuthManager();
mIMAuthManger.login(mAuthInfo);

监听登录状态

IMLib.getInstance().getAuthManager().registerConnStatusObserver(sConnObserver);
    Observer sConnObserver = new Observer@Override
     public void onEvent(StatusCode statusCode) {
         switch (statusCode) {
             case INVALID:
             case UNLOGIN:
             case NET_BROKEN:
             case CONNECTING:
             case LOGINING:
             case LOGINED:  
             case FORBIDDEN:
             case VER_ERROR:  
             case AUTH_ERROR:  
                 
                 break;
         }
     }
 };


3.2 自动登录

如果已经登录过程序重启时通过IMAuthManger.init传入的authInfo判断不为空时会自动登录, 此时可以直接跳过登录页面直接进入主界面。 

重连机制,IM客户端与Sever使用长连接保证数据的实时到达。当通讯断开时会自动重新连接,加接不上时会延时一段时间做尝试连接。网络重连时也会马上进行连接。


3.3 登出

登录时需要调用各模块的登出,登录接口会清除各sdk内部的登录状态。通知服务端退出。

IMLib.getInstance().getAuthManager().logout();
 MCLib.getInstance().getAuthManager().logout();
 UserLib.getInstance().getAuthManager().logout();


 

3.4 踢下线

      只允许一端登录,另一端登录时会把先前登录的踢下线。

监听踢下线

IMLib.getInstance().getAuthManager().registerKickObserver(mKickOffObserver);


3.5 数据同步

各sdk有提供了数据同步接口需要在登录成功时调用.

3.6 IM数据同步

imSdk提供了同步接口,同步群组列表和群成员列表,最近联系人列表,用户屏蔽列表等。IM服务器登录成功时sdk会自动同步。需要监听同步状态。

IMLib.getInstance().getSyncStatusObserve().registerSyncStatusObserver(new Observer@Override
     public void onEvent(SyncStatus syncStatus) {
         switch (syncStatus){
             case SYNCING:
                 //TODO:
                 break;
             case SYNC_SUCCESS:
                 //TODO:
                 break;
             case SYNC_FAILED:
                 //TODO:
                 break;
         }
       }
      });

也可以手动调用同步数据

IMLib.getInstance().sync();


3.7 监听在线状态变化

IMLib.getInstance()
         .getIMUserStatusObserver()
         .registerUserStatusChange(new Observer@Override
             public void onEvent(IMOnLineStatus paramT) {
                 int status = paramT.getUserStatus();
                 /**
                  * 用户设备的登录状态
                  状态位从低到高 每种设备占4位
                  0-3 windows
                  4-7 android
                  8-11 ios
                  11-14 mac
                  需要根据对应位获取对应设备的登录状态*/
             }
         });


4 消息功能

4.1 发送消息

发送消息时需要调用MessageBuilder创建对应的消息并调用MsgManager.sendMessage发送消息.

监听消息发送状态

IMLib.getInstance().getMsgManagerObserver().registerMsgStatusObserver(new Observer@Override
     public void onEvent(SendMsgStatus status) {
         MsgStatusEnum  msgStatus = status.getMsgStatus();//; 发送状态
         ResponseCode responseCode = status.getResponseCode();// 发送错误码,只有发送成功或者失败时才有值
         Message msg =  status.getMessage(); // 消息
     }
 });

发送文件,图片,语音消息时可以监听发送进度, 上传和下载都通过该监听

IMLib.getInstance()
         .getMsgManagerObserver()
         .registerAttachmentProgressObserver(new Observer@Override
             public void onEvent(AttachmentProgress paramT) {
                 paramT.getMsgDbId(); // 本地数据库存储id,可以用来唯一识别消息
                 paramT.getTotal(); // 总大小
                 paramT.getTransferred(); // 已经上传的
             }
         });


4.2 发送普通消息

Message textMsg = MessageBuilder.createTextMessage(sessionId, sessionType, content);
 IMLib.getInstance().getMsgManager().sendMessage(textMsg, false);


 

4.3 发送图片消息

发送图片消息时会先上传文件到容能云文件服务器再发送消息。发送成功后可以通过ImageAttachment.getUrl()获取上传后的图片url

// 发送图片消息
 String iamgePath = "/sdcard/xx.jpg";
 Message imageMsg = MessageBuilder.createImageMessage(sessionId, sessionType, iamgePath);
 IMLib.getInstance().getMsgManager().sendMessage(imageMsg, false);


4.4 发送文件消息

发送文件消息时会先上传文件到容能云文件服务器再发送消息

// 发送图片消息
 String iamgePath = "/sdcard/xx.jpg";
 Message imageMsg = MessageBuilder.createImageMessage(sessionId, sessionType, iamgePath);
 IMLib.getInstance().getMsgManager().sendMessage(imageMsg, false);


4.5 发送语音消息

语音需要调用AudioRecordHandler语音录制接口, 录制成功后发送消息

String audioDir = "/sdcard/audio/"; // 指定语音文件存储目录
 AudioRecordHandler  audioRecorderInstance;
 audioRecorderInstance = new AudioRecordHandler(audioDir, 60*10000);
 audioRecorderInstance.record(new IAudioRecordCallback() {
     @Override
     public void onRecordStart(String audioPath) {}
     @Override
     public void onRecordSuccess(final String audioPath, final long recordTime) {
         Message audioMsg = MessageBuilder
                 .createAudioMessage(sessionId,
                 sessionType,
                 audioPath,
                 recordTime);
         IMLib.getInstance().getMsgManager().sendMessage(audioMsg,false);
     }
     @Override
     public void onRecordFail(String audioPath) {}
     @Override
     public void onRecordReachedMaxTime(String audioPath, long recordTime) { }
     @Override
     public void onVolumChange(final int volume) {}
 });


4.6 发送@消息

发送@消息要标识人名的位置,和人名对应的userId.

// AT  具体实现参考 UISDK里的 InputPanelView.java
 String atText = "@容能云 @IM 你好";
 Listnew ArrayList<>();
 // 每个@的名字需要@开头空格结尾
 AtAttachment.AtPos atPos = new AtAttachment.AtPos();
 atPos.start = 0;// @在字符串中的开始位置
 atPos.len = 5; // 名字长度,包含@名字和空格
 atPos.userId = "ra23124wsa5r09a8f09sa8fs0fs0f8";
 atPosList.add(atPos);
 
 AtAttachment.AtPos atPos1 = new AtAttachment.AtPos();
 atPos.start = 5;// @在字符串中的开始位置
 atPos.len = 4; // 名字长度,包含@名字和空格
 atPos.userId = "ra23124wsa22222222222"; // 标识人名对应的userId
 atPosList.add(atPos);
 
 Message atMsg = MessageBuilder.createAtMessage(sessionId, sessionType,atText,atPosList);
 IMLib.getInstance().getMsgManager().sendMessage(atMsg,false);


4.7 接收消息

通过注册消息接收观察者监听消息到达

IMLib.getInstance()
         .getMsgManagerObserver()
         .registerReceiveMessageObserver(new Observer@Override
             public void onEvent(Message paramT) {
                 
             }
         });


4.8 文件下载

对于语音,文件 提供了下载接口,可以下载对应的文件

IMLib.getInstance()
         .getMsgManager()
         .downloadAttachment(message);

 监听文件下载状态

IMLib.getInstance()
         .getMsgManagerObserver()
         .registerAttachmentProgressObserver(new Observer@Override
             public void onEvent(AttachmentProgress paramT) {
                 paramT.getMsgDbId(); // 本地数据库存储id,可以用来唯一识别消息
                 paramT.getTotal(); // 总大小
                 paramT.getTransferred(); // 已经下载的大小
             }
         });

取消下载文件

IMLib.getInstance()
         .getMsgManager()
         .canelDownload(message);


4.9 最近联系人列表

最近联系人列表,记录了与用户最近的联系人。按时间顺序从近到远排列。有收到消息时sdk内部会更新联系人列表并发出通知。该列表服务端会保存。其他端修改时也会通知变化。

4.9.1 监听最近会话列表变化

Observer<listnew Observer<list@Override
     public void onEvent(List// 收到的是变化的消息,需要跟当前的进行比较并重新排列
         mRecentContactList = ListUtil.updateSame(mRecentContactList, contactList, equalCompare);
         sortRecentList(mRecentContactList);
         updateList(mRecentContactList);
     }
 };


4.9.2 监听最近会话列表删除

Observer<list>recentContactDeletedObserver = new Observer<list>() {
    @Override
     public void onEvent(ListcontactList) 
 };


4.9.3 消息置顶

消息置顶功能置顶状态是存在本地不会同步的其他端.调用完会触发最近联系人列表变化 通知

IMLib.getInstance()
         .getMsgManager()
         .setTopRecentContact(sessionId, sessionType, true);


 

4.10 撤回消息

发送的消息支持2分钟之内进行撤回。对消息撤回有如下限制

1. 发送超过2分钟的消息不能撤回

2. 没发送成功的消息不能撤回

3. 不是自己发送的消息不能撤回

撤回消息

mMsgManager.recallMessage(msg)
         .request(new IResponseCallback

撤回时可以监听撤回的消息,撤回的消息msgId不会变但消息状态变成了reacall, 消息类型变成了通知消息

IMLib.getInstance()
         .getMsgManagerObserver()
         .registerRecallMessageObserver(new Observer@Override
     public void onEvent(Message paramT) {
         // 此处更新界面的消息
     }
 });


4.11 消息提醒

      容能云IM后台进程保持着与后台的长连接,后台Server有推送消息过来时会会在通知栏提醒.    

以下场景不会有消息提醒

1. 屏蔽的用户不会有消息提醒

2. 停留在聊天界面不会有消息提醒

3. 关闭了消息提醒不会有消息提醒

4. 自己其他端发送的消息不会有消息提醒

以下场景会有消息提醒

1. App退到后台时

2. 非当前聊天的消息

3. 在非聊天界面和最近联系人列表界面

IMSDK提供相应的配置接口

// 设置当前的会话,当前会话消息不会收到通知提醒,非当前会话会有通知提醒
 IMLib.getInstance()
         .getMsgManager()
         .setChattingUser(sessionId, sessionType);
 
 // 可在在退出最近联系人列表页面和聊天界面(onPause)处调用
 IMLib.getInstance()
         .getMsgManager()
         .setChattingUser(StatusBarNotificationConfig.NOTIFY_ALL, SessionTypeEnum.None);
 
 //  在最近联络人列表页面设置不提醒
 IMLib.getInstance()
         .getMsgManager()
         .setChattingUser(StatusBarNotificationConfig.NOTIFY_NONE, SessionTypeEnum.None);

接收消息时本地全局配置(不可漫游)

在 SDKOption 中有通知栏提醒配置选项 StatusBarNotificationConfig:

      √ 是否有通知提醒开关

      √ 通知栏弹出时的小图标(ticker),默认用App的图标。

      √ 是否需要响铃(指定铃声)

      √ 是否需要震动

      √ 呼吸灯颜色、闪烁时长

      √ 点击通知栏要跳转到的界面,一般跳转到对应的会话界面

StatusBarNotificationConfig.notificationEntrance;

点击通知栏时会调用以下Intent高动对应的activity.所以可以在启动的activity内获取 sesionId和sessionType,

Intent intentActivity = new Intent(ctx, config.notificationEntrance);
 intentActivity.putExtra(ImIntent.KEY_SESSION_ID, sessionId);//点击进去的是最后一个未读消息的聊天窗口
 intentActivity.putExtra(ImIntent.KEY_SESSION_TYPE, sessionType);


4.12 消息提醒配置

提供了针对个人或群是否有消息提醒的配置.该配置是可漫游的。关闭提醒后收到消息不会有通知栏提醒。

个人消息提醒配置

IMLib.getInstance()
         .getImUserManager()
         .shieldUser(userId, ShieldStatusEnum.SHIELD)
         .request(new IResponseCallback

群主消息提醒配置

IRequestHandlegroupManager.shieldGroup(groupId, isShield);
 requestHandle.request(new IResponseCallback


4.13 自定义通知栏

容能云提供接口可以让用户定制通知栏文字的显示.在IMSdkOptions进行配置。不配置的话使用默认的消息格式

options.messageNotifierCustomization = new MessageNotifierCustomization() {
     @Override
     public String makeNotifyContent(Message message) {
         return null;//文字
     }
 
     @Override
     public String makeTicker(Message message) {
         return null;// 标题
     }
 }


4.14 历史消息

       容能云 IM消息都会保存在云端。对于接收到的消息会保存到本地数据库。IMSdk提供了读取本地缓存消息和服务端消息的接口


4.14.1 获取本地消息

 根据锚点和方向从本地消息数据库中查询消息历史。根据提供的方向(direct),查询比anchor更老(QUERY_OLD)或更新(QUERY_NEW)的最靠近anchor的limit条数据。调用者可使用asc参数指定结果排序规则,结果使用time作为排序字段。会根据 message里的sessionId, sessionType 和createTime从本地数据库查询数据.

如果createTime为0时会从最近的消息开始查询

Message anchorMsg = MessageBuilder.createEmptyMessage(sessionId, sessionTypeEnum, 0);
    mMsgManager.getLocalMessageList(anchorMsg, 
         QueryDirectionEnum.QUERY_OLD, 
         PAGE_SIZE, 
         true, 
         true);


4.14.2 获取云端消息

根据提供的方向 (direction),以 anchor 为起始点,往前或往后查询 limit 条消息。

查询结果按时间顺序升序排列

mMsgManager.getMessageList(messageStart, QueryDirectionEnum.QUERY_OLD, limit, containAnchor)
         .request(new IResponseCallback<List<Message>>() {


4.15 语音录制和回放

提供了语音录制和回放的接口

IMAudioRecorder录制语音

IMAudioPlayer 语音播放


4.15.1 录制

IMSdk 提供IMAudioRecorder用于语音录制

String audioDir = "/sdcard/audio/"; // 指定语音文件存储目录
AudioRecordHandler  audioRecorderInstance;
audioRecorderInstance = new AudioRecordHandler(audioDir, 60*10000);
audioRecorderInstance.record(new IAudioRecordCallback() {
    @Override
    public void onRecordStart(String audioPath) {}
    @Override
    public void onRecordSuccess(final String audioPath, final long recordTime) {
    //录制成功
    Message audioMsg = MessageBuilder
        .createAudioMessage(sessionId,
            sessionType,
            audioPath,
            recordTime);
        IMLib.getInstance().getMsgManager().sendMessage(audioMsg,false);
    }
    @Override
    public void onRecordFail(String audioPath) {
    //录制失败

}
    @Override
    public void onRecordReachedMaxTime(String audioPath, long recordTime) {
    // 录音达到指定的时长
}
    @Override
    public void onVolumChange(final int volume) {
    // 录音音量的变化
}
});

4.15.2 回放

提供回放,和听筒 外放切换功能

// 播放
    IMAudioPlayer.getInstance(context).starttPlay(msg);
    // 监听播放状态
    IMAudioPlayer.getInstance(context).addAudioListener(new IMAudioPlayer.AudioListener() {
     @Override
     public void onStart(Message audioMessage) {
         
     }
 
     @Override
     public void onStop(Message audioMessage) {
 
     }
 
     @Override
     public void onEnd(Message audioMessage) {
 
     }
 });


5 群组功能

IMSDK提供了群组功能

1. 创建群组

2. 邀请加入群组

3. 申请加入群组

4. 踢人出群组

5. 退出群组

6. 解散群组

7. 设置管理员

8. 转让群组

9. 设置群成员禁言

10. 设置群禁言

11. 设置群成员昵称

12. 监听群组资料变化

监听群成员变化


5.1 创建群组

IRequestHandlerequestHandle = groupManager.createGroup(groupName, groupFieldMap, userIds);
 requestHandle.request(new IResponseCallback() {});


5.2 邀请加入群组

      加群有两种接口,一种直接将人加入群组,不用对方确认,一种是需要对方确认完才能加入群。

加人(不用对方同意)

IRequestHandle<List<String>> addMembers(String groupId, List<String> userIdList);

邀请加人(需要对方同意)

IRequestHandle<Void> inviteMember(String groupId, List<String> addMemberIdList, String message);

发送加人申请后对方会收到系统消息

调用接口同意或拒绝请求

同意邀请:GroupVerifyStatus. STATUS_ACCEPT

拒绝邀请: GroupVerifyStatus. STATUS_DECLINE

IRequestHandle<Void>inviteMemberVerify(String groupId, String inviteUserId, 
    GroupVerifyStatus verifyStatus);

5.3 申请加入群组

申请加群后群主和管理员会收到系统消息推送

IRequestHandle<Void> applyJoinGroup(String groupId, String message);

群主管理员可以通过或拒绝申请. 通过、拒绝后会收到系统消息推送。群内也会有通知消息

通过、拒绝入群申请(只有管理员有权限)

同意申请 GroupVerifyStatus. STATUS_ACCEPT

拒绝申请 GroupVerifyStatus.STATUS_REJECT

IRequestHandle<Void> applyJoinGroupVerify(String groupId, String joinUserId, 
GroupVerifyStatus statusEnum);

通过 、拒绝入群邀请

IRequestHandle<Void> inviteMemberVerify(String groupId, String inviteUserId, 
GroupVerifyStatus verifyStatus);


5.4 踢人出群

群主和管理员才有踢人权限

IRequestHandle<List<String>> removeMember(String groupId, String memberId);


5.5 退群

IRequestHandle<Void> quitGroup(String groupId);

5.6 解散群组

只有创建者有权限

IRequestHandle<Void> dismissGroup(String groupId);


5.7 设置管理员

只有创建者有权限

IRequestHandle<Void> addManagers(String groupId, List<String> userIdList);


5.8 转让群组

只有创建者有权限

IRequestHandle<Void> transferGroup(String groupId, String newOwnerId, boolean quit);


5.9 设置群成员禁言

群主管理员有权限

IRequestHandle<Void> muteGroupMember(String groupId, String userId, boolean mute);


5.10 设置群禁言

全群禁言,管理员和群主可发言,其他人无法发言

IRequestHandle<Void> muteGroup(String groupId, boolean mute);


5.11 设置群成员昵称

群组管理员修改群内其他成员的群昵称。仅群管理员和拥有者有此权限

IRequestHandle<Void> updateMemberNick(String groupId, String userId, String nickName);


5.12 设置自己昵称

IRequestHandle<Void> updateMyGroupNick(String groupId, String nickName);


5.13 加群通过的通知

群管理员通过后会收到该通知。本地缓存数据会更新,同时MC会收到提醒

void registerApplyJoinPass(Observer<GroupApplyPass> paramObserver);


5.14 新加入群通知

用户新加入群后通知。本地缓存数据会更新,同时MC会收到提醒

void registerGroupAdd(Observer<String> paramObserver);


5.15 群更新的通知

群资料变化通知,本地缓存数据会更新

void registerGroupUpdate(Observer<Group> paramObserver);



5.16 移除群的通知

用户被踢出时会收到该通知。本地缓存数据会更新,同时 MC会收到提醒

void registerGroupRemove(Observer<Group> paramObserver);



5.17 添加群成员的通知

群成员新增时会收到该通知,本地缓存数据会更新

void registerMemberAdd(Observer<List<GroupMember>> paramObserver);


5.18 群成员更新的通知

群成员信息变化收到该通知,本地缓存数据会更新

void registerMemberUpdate(Observer<List<GroupMember>> paramObserver);


5.19 群成员移除的通知

有群成员退出时会收到该通知,本地缓存数据会更新,管理员会收到MC提醒

void registerMemberRemove(Observer<List<GroupMember>> paramObserver);


6 消息中心(MC)

容能云专门提供了消息中心(Message Center 简称MC)用于各能力的通知。需要引入mcSdk.jar。 IM相关的系统消息会通MC通知给用户。例如入群申请,通过申请等。如果托管了好友关系,好友申请,好友变化等都是通过MC发出. mcSdk提供了消息接收和存储等功能。

消息中心的消息分为 通知消息和系统消息.

通知消息 在连接状态的时候才会发出,没连接就不会发出,不会存储在服务端。该消息用户不可见。主要用于在线状态数据实时同步的控件命令使用。

系统消息 服务器会存储该消息,可以通过获取系统消息列表获取,并提供相关操作接口。


6.1 监听系统消息

MCLib.getInstance()
         .getSysMsgManagerObserve()
         .registerReceiveSysMsgObserver(new Observer@Override
             public void onEvent(SysMessage sysMessage) {
 
             }
         });


6.2 查询系统消息列表

IRequestHandle<List<SysMessage>> requestHandle = msgManager.getSysMsgList(CapacityIdEnum.ALL,
         time, PAGER_COUNT, QueryDirectionEnum.QUERY_OLD, true, false);


6.3 设置系统消息状态

同意,同过,拒绝,忽略,过期,还提供了扩展状态用于自定义

MCLib.getInstance().getSysMsgManager()
         .changeSysMsgExtStatus(msgID, ExtStatusEnum.EXT_STATUS_ACCEPT)


6.4 删除一条系统消息

IRequestHandle<Void> deleteSysMessage(final List<SysMessage> sysMsgList)


6.5 删除指定能力的系统消息

IRequestHandle<Void> deleteAllSysMessage(final CapacityIdEnum capacityIdEnum)


7 用户关系托管

容能云提供了好友关系的托管,好友资料(用户资料)由APP自行托管,或着选用容能云用户资料托管。

好友关系管理模块

UserLib.getInstance()
         .getFriendManager();


7.1 添加好友

被添加方会收到系统消息通知

IRequestHandle<Void> addFriend(String userId, String verifyMsg);


7.2 通过好友请求

通过好友请求,可以设置备注名。通过后,申请方会收到通过提醒

IRequestHandle<Void> allowFriendApply(String userId, String remark);


7.3 拒绝好友请求

拒绝后,申请方会收到拒绝提醒

RequestHandle<Void> refuseFriendApply(String userId);


7.4 删除好友

删除好友后把自己和地方的好友关系中移除

IRequestHandle<Void> deleteFriend(String friendUserId);


7.5 监听好友关系变化

UserLib.getInstance()
         .getFriendManagerObserve()
         .registerFriendChangeObserver(new Observer@Override
             public void onEvent(FriendChange paramT) {
 
             }
         });


7.6 获取好友列表

UserLib.getInstance()
         .getFriendManager()
         .getAllFriends()
         .request();


8 黑名单

8.1 获取黑名单列表

UserLib.getInstance()
         .getFriendManager()
         .getAllBlackListUserIds()
         .request();


8.2 加入黑名单

加入黑名单,发送方无法发送消息,接收方也收不到消息

UserLib.getInstance()
         .getFriendManager()
         .addToBlackList(userId);


8.3 移出黑名单

UserLib.getInstance()
         .getFriendManager()
         .removeFromBlackList(userId);


8.4 监听黑名单变化

UserLib.getInstance()
         .getFriendManagerObserve()
         .registerBlacklistChangeObserver(new Observer@Override
             public void onEvent(BlacklistChange paramT) {
 
             }
         });


9 用户资料托管

用户资料托管提供了用户短信注册接口,可以方便APP直接通过短信注册添加用户.找回密码,并提供接口维护用户资料.


9.1 注册用户

1. 发送短信验证码,获取验证码标识

发送短信需要到开发者平台开通短信功能。

String phone = "12354678901";
 String templateCode = "1"; // 短信模板,需要在开发者中心设置
 UserLib.getInstance()
         .getUserManager().sendRegisterSmsCode("12354678901", templateCode)
         .request(new IResponseCallback@Override
             public void onSuccess(String data) {
                 String codeUuid = data;// 验证码的惟一标识添加用户时要用
             }
 
             @Override
             public void onFailed(ResponseCode responseCode) {
             }
         });

2. 验证码标识和收到的短信验证码进行添加用户

String phone = "12354678901"; // 电话号码
 String pwd = "123456";        // 密码
 String smsCode = "123456";    // 短信验证码
 String smsUuid = "abcdefghicssmnopsesq123f8x0d9sec"; // 短信惟一标识
 Mapnew HashMap<>(); // 用户资料
 fields.put(UserFieldEnum.NICK_NAME,"用户昵称");
 UserLib.getInstance()
         .getUserManager()
         .addUser(phone,pwd, smsCode,smsUuid, fields);


9.2 找回密码

用户提供了找回密码功能

1. 发送找回密码短信验证码

UserLib.getInstance()
         .getUserManager()
         .sendGetBackPswSmsCode(phone, templateCode)
         .request(new IResponseCallback@Override
             public void onSuccess(String data) {
                 String smsUuid = data; // 短信惟一uuid
             }
 
             @Override
             public void onFailed(ResponseCode responseCode) {
 
             }
         });

2. 重置密码

通过uuid和短信验证码重置密码

UserLib.getInstance().getUserManager().resetUserPassword(phone, authCode, codeUuid, pwd)
         .request();


9.3 从服务器获取用户资料

可以通过用户id批量获取用户资料

Listnew ArrayList<>();
 userIdList.add("abcdefghijklmnopsesq123f8x0d9g8b");
 userIdList.add("abcdefghicssmnopsesq123f8x0d9sec");
 UserLib.getInstance()
         .getUserManager()
         .getUsers(userIdList)
         .request();


9.4 从本地获取用户资料

加载过的数据会缓存在本地

Listnew ArrayList<>();
 userIdList.add("abcdefghijklmnopsesq123f8x0d9g8b");
 userIdList.add("abcdefghicssmnopsesq123f8x0d9sec");
 UserLib.getInstance()
         .getUserManager()
         .getLocalUsers(userIdList);


9.5 修改用户资料

需要Map

Mapnew HashMap<>(); 
 fields.put(UserFieldEnum.NICK_NAME,"用户昵称"); // 设置需要修改的字段
 fields.put(UserFieldEnum.PHONE,"123456678");
 UserLib.getInstance()
         .getUserManager()
         .modifyUser(fields)
         .request();


9.6 监听用户资料变化

UserLib.getInstance()
         .getUserManagerObserve()
         .registerUserObserver(new Observer@Override
             public void onEvent(User paramT) {
 
             }
         });


10 公司组织架构托管

容能云提供了组织架构和员工资料的托管功能。组织架构树,部门管理,岗位管理,员工资料管理等。


10.1 公司

10.1.1 创建公司

调用该接口服务端会做如下操作

     1. 创建公司

     2. 创建一个和公司名称相同的根部门

     3. 合建一个员工(超级管理员),该员工为当前登录用户

     4. 添加该员工和根部门的部门员工关系

Mapnew HashMap<>();
 map.put(CompanyFieldEnum.COMPANY_NAME, shortNameStr);
 map.put(CompanyFieldEnum.COMPANY_FULL_NAME, longNameStr);
 map.put(CompanyFieldEnum.INDUSTRY, industryStr);
 
 String userId = UISdk.getCurUserId();
 User user = UserCache.getInstance().getUser(userId);
 mCompanyManager.addCompany(user.getNickname(), map)
         .request(new IResponseCallback

创建成功后需要调用同步数据接口,拉取创建的公司,部门,员工等到本地缓存

UserLib.getInstance()
         .getCompanyManager()
         .sync()
         .request();


10.1.2 修改公司资料

只有管理员有权限

Mapnew HashMap<>();
 map.put(CompanyFieldEnum.COMPANY_NAME, shortNameStr);
 map.put(CompanyFieldEnum.COMPANY_FULL_NAME, longNameStr);
 map.put(CompanyFieldEnum.INDUSTRY, industryStr);mComapnyManager.modifyCompany(companyId, map)
         .request();


10.1.3 删除公司

只有超级管理员可以删除公司

UserLib.getInstance()
         .getCompanyManager()
         .deleteCompany(companyId)
         .request();

获取当前用户加入的公司

IRequestHandle<List<Company>> queryCompany();

10.1.4 申请加入公司

UserLib.getInstance()
         .getCompanyManager()
         .applyJoinCompany(companyId,"申请信息");


10.1.5 允许加入公司

UserLib.getInstance()
         .getCompanyManager()
         .allowJoinCompanyApply(companyId, userID);


10.1.6 拒绝加入公司

UserLib.getInstance()
         .getCompanyManager()
         .refuseJoinCompanyApply(companyId, userID);


10.1.7 被加入公司通知

当前用户被加入公司时的通知。回调为被加入的公司ID

UserLib.getInstance()
         .getCompanyManagerObserve()
         .registerStaffJoinInCompanyObserver(new Observer@Override
             public void onEvent(String companyId) {
                 // companyId为被加入的公司ID
             }
         });


10.1.8 监听公司资料变化

ChangeType.ADD 需要用户主动调用同步接口CompanyManager.sync()同步公司相关资料

ChangeType.MOD Sdk内部会加载最新的数据到本地缓存,再发出变化通知. ChangeType.DEL 会删除本地缓存数据,发出通知

UserLib.getInstance()
         .getCompanyManagerObserve()
         .registerCompanyChangeObserver(new Observer@Override
             public void onEvent(CompanyChange paramT) {
                 paramT.getChangeType(); // 变化类型 增,删,改
                 paramT.getCompanyIds();// 变化的公司 ID
    
             }
         });


10.2 部门

10.2.1 添加部门

添加部门时可以通过Map设置部门属性,需要设置部门所属父部门ID

Mapnew HashMap<>();
 fields.put(DepartmentFieldEnum.DEPARTMENT_NAME, departmentName);// 部门名
 fields.put(DepartmentFieldEnum.PARENT_ID, mParentId);// 父部门ID
 
 UserLib.getInstance()
         .getCompanyManager()
         .addDepartment(companyId, filelds)
         .request();


10.2.2 删除部门

只有管理员有权限

UserLib.getInstance()
         .getCompanyManager()
         .deleteDepartment(companyId, departId)
         .request();


10.2.3 修改部门

只有管理员有权限

MapgetInstance()
         .getCompanyManager()
         .modifyDepartment(companyId,departMentId, fields)
         .request();


10.2.4 查询部门列表

UserLib.getInstance()
         .getCompanyManager()
         .queryDepartments(companyId);


10.2.5 部门变化

收到变化通知前本地的缓存数据已是最新,收到变更通知后可以从缓存获取最新部门数据.

部门删除时部门下的员工会变到根结点,需要用户主动拉取最新的员工部门关系.

UserLib.getInstance()
.getCompanyManagerObserve()
.registerDepartmentChangeObserver(new Observer<DepartmentChange>() {
    @Override
            public void onEvent(DepartmentChange paramT) {
        paramT.getChangeType();// 变化类型 增,删,改
        List<String> departIds =
            paramT.getDepartmentIds();// 变化的部门ID
      // 可以根据ID从本地缓存获取最新数据
            UserLib.getInstance()
            .getCompanyManager()
            .getLocalDepartments(departIds);

            }
        });


10.3 岗位

10.3.1 添加岗位

只有管理员有权限

Mapnew HashMap<>();
 positionFileds.put(PositionFieldEnum.POSITION_NAME, "技术总监");
 UserLib.getInstance()
         .getCompanyManager()
         .addPosition(companyId, positionFileds);


10.3.2 删除岗位

只有管理员有权限

UserLib.getInstance()
         .getCompanyManager()
         .deletePosition(companyId, positionId);


10.3.3 修改岗位

只有管理员有权限

UserLib.getInstance()
         .getCompanyManager()
         .modifyPosition(companyId, psotionId, positionFileds);


 

10.3.4 查询公司岗位

获取某公司下的所有岗位信息

UserLib.getInstance()
         .getCompanyManager()
         .queryPositions(companyId);


10.3.5 查询部门岗位关系

每个部门有不同的岗位,部门和岗位是一对多

UserLib.getInstance()
         .getCompanyManager()
         .queryDepartmentPositions(companyId);


10.3.6 监听部门岗位关系

部门下的岗位增删改通知

UserLib.getInstance()
         .getCompanyManagerObserve()
         .registerDepartmentPositionChangeObserver(new Observer@Override
             public void onEvent(DepartmentPositionChange paramT) {
                 paramT.getCompanyId();      // 公司ID
                 paramT.getChangeType();     // 增删
                 paramT.getDepartmentPositions();// 部门岗位关系
             }
         });


10.4 员工

10.4.1 添加员工

       员工是和用户(userId)关联的,所以创建时需要指定userId.用户和员工是一对多关系。一个用户可以在多个公司下。所以一个用户在不同的公司有不同的员工信息。添加员工默认会挂到根部门下面

Mapnew HashMap<>();
 stafffFileds.put(StaffFieldEnum.FULL_NAME, "张三");
 UserLib.getInstance()
         .getCompanyManager()
         .addStaff(companyId, userID,stafffFileds);


10.4.2 修改员工资料

MapstafffFileds =new HashMap<>();
 stafffFileds.put(StaffFieldEnum.FULL_NAME, "张三");UserLib.getInstance()
         .getCompanyManager()
         .modifyStaff(companyId, staffId, stafffFileds);


10.4.3 查询公司下的员工

UserLib.getInstance()
         .getCompanyManager()
         .queryStaffs(companyId);


10.4.4 员工资料变化通知

UserLib.getInstance()
         .getCompanyManagerObserve()
         .registerStaffChangeObserver(new Observer@Override
             public void onEvent(StaffChange paramT) {
                 paramT.getChangeType(); // 变化 增删改
                 paramT.getStaffIds();   // 变化的员工ID
                 paramT.getCompanyId();  // 员工所属公司ID
             }
         });


10.4.5 员工部门关系

员工和部门是多对多的关系,员工可以在多个部门,一个部门可以有多个员工。


10.4.6 添加员工到部门

UserLib.getInstance()
         .getCompanyManager()
         .addDepartmentStaff(companyId, departmentId, staffId);


10.4.7 移动员工部门关系

移动员工会先删除目标员工原有所有的部门员工关系

UserLib.getInstance()
         .getCompanyManager()
         .moveDepartmentStaffs(companyId, departIdList, staffIdList);


10.4.8 员工部门关系变化通知

增加: 员工被加入部门时会有

删除 :员工被移除部门时

UserLib.getInstance()
         .getCompanyManagerObserve()
         .registerDepartmentStaffChangeObserver(new Observer@Override
             public void onEvent(DepartmentStaffChange paramT) {
 
             }
         });


10.5 员工岗位关系

员工在不同的部门会有不同的岗位。


10.5.1 查询员工岗位关系

UserLib.getInstance()
         .getCompanyManager()
         .queryStaffPositions(companyId);


10.5.2 员工岗位关系变化通知

UserLib.getInstance()
         .getCompanyManagerObserve()
         .registerStaffPositionChangeObserver(new Observer@Override
             public void onEvent(StaffPositionChange paramT) {
                 paramT.getCompanyId();      // 公司ID
                 paramT.getChangeType();     // 增删
                 paramT.getStaffPositions();// 员工岗位关系
             }
         });


11 消息推送

      容能云本身已自带长连接推送,单由于android系统对进程的管理,难以保证自带的长连接一直存活,当app进程未存活时,消息无法到达,降低了推送消息到达率,针对国内Android GCM无法使用的情况,为增加容能云消息推送到达率,集成了小米推送、华为推送,用户使用小米系统或华为系统时,能通过其定制rom的消息推送通道推送消息。


11.1 小米推送

准备工作

1、前往小米推送官网申请小米开发者账号,创建应用,获取AppID、AppKey、AppSecret,注意创建应用指定的包名必须与app一致,且后续无法更改

2、下载小米推送sdk,根据小米说明文档集成到自身app project中(容能云sdk不包含小米sdk,需要开发者自行导入)

3、在容能云后台管理中心,进入应用管理并添加小米推送信息


image.png


11.2 华为推送

准备工作

1、前往华为推送官网申请开发者账号,创建应用并获取AppID、AppKey、AppSecret,注意创建应用指定的包名必须与app一致,且后续无法更改

2、下载华为推送sdk,根据华为官方说明文档集成到自身app project中(容能云sdk不包含华为sdk,需要开发者自行导入)

3、在容能云后台管理中心,进入应用管理并添加华为推送信息


image.png


11.3 SDK初始化第三方推送

IMSDKOptions imsdkOptions = getOptions();

//初始化推送,必须在im和mc之前,因为这2个模块有依赖,如果不使用第三方推送,不需调用
//注册小米推送信息,启用小米推送
PushSetting.registeMiPush("2882303761517577822","5891757730822");
//注册华为推送,启用华为推送
PushSetting.registeHwPush();
PushClient.init(this);

//必须在各个lib之前init,因为其他lib有对MCLib引用
MCLib.init(this, authInfo, null, new MCLib.Callback() {
    @Override
    public void onInit() {
log.i("onInit MCLib....");
    }
});


11.4 注册推送login/logout

//注册推送
IMLib.getInstance().getAuthManager().registerConnStatusObserver(new Observer<StatusCode>() {
    @Override
    public void onEvent(StatusCode paramT) {
        if(StatusCode.LOGINED == paramT){
            PushClient.getInstance().login(DemoApplication.this,IMLib.getInstance().
            getAuthManager().getAuthInfo());
        }else if(StatusCode.LOGOUT == paramT){
            PushClient.getInstance().logout(DemoApplication.this);
        }
    }
});


11.5 添加/删除推送消息监听

当第三方推送接收到推送消息时,通过该监听通知

PushClient.getInstance().add/delMessageListener(new IPushMsgListener() {

@Override
public void onThroughtMessageArrive(PushMessage message) {

}

@Override
public void onNotifyMessageOpen(PushMessage message) {

}

@Override
public void onDeviceRegiste(PushType pushType, String token) {

}

    
}


11.6 推送消息自定义

容能云针对每条Message,提供了自定义第三方推送通知栏显示的功能:

class Message{

……
    /**
     * 设置推送标题
     * @param title
     */
void setPushTitle(String title);

    /**
     * 获取推送消息
     * @return
     */
String getPushContent();

……
}


12 音视频聊天

容能云提供了音视频聊天功能。

目前音视频聊天支持单聊和群聊模式,不同模式下的视频编码质量有区别,单聊的质量高,对带宽要求高,群聊质量略低,对带宽要求低

启动音视频聊天的简要流程:

1、发起新聊天

2、 注册相关监听,监听成员状态响应及会话状态

3、设置显示及相关初始化(设置surface、声音模式等)

4、启动音频/摄像头采集

5、关闭聊天

6、停止音频/视频采集,停止播放其余成员信息

7、释放相关资源

 

接收一个新聊天请求的简要流程:

1、监听到新聊天请求,解析请求参数,获取聊天信息,启动聊天邀请页面

2、用户选择接收聊天邀请

3、注册相关成员状态/回话监听

4、启动音频/视频采集和播放

5、接收到关闭聊天监听

6、停止音频、视频采集,停止播放成员信息

7、释放相关资源


12.1 设置听筒/免提模式

/**
 *第二参数,true免提模式,false听筒模式
 **/
MediaLib.getInstance().getMediaResourceManager().setSpeekerMode(mContext, true);


12.2 设置自身摄像头预览surface

启动视频录制前需要先指定用于摄像头预览的显示view,支持热切换view

//传入要显示的surface
MediaLib.getInstance().getMediaResourceManager().setSelfVideoPreview(surfaceView);


12.3 设置他人视频显示surface

设置对方usrid以及要用于显示对方视频的view,支持热切换view

/** *传入目标用户usrid,以及要显示的surfacevew **/MediaLib.getInstance().getMediaResourceManager().
setOtherVideoPreview(usrid, surfaceView);


12.4 启动摄像头录制

需要指定视频聊天类型(p2p,Group),容能云针对单聊/群聊采用了不同的编码参数,单聊编码质量更高,视频较清晰,群聊编码质量较低,对带宽要求较低

MediaLib.getInstance().getMediaResourceManager().startVideoCapture(ChatTypeEnum.P2P);


12.5 启动录音

MediaLib.getInstance().getMediaResourceManager().startAudioCapture();


12.6 切换摄像头

MediaLib.getInstance().getMediaResourceManager().switchCamera();


12.7 音视频监听处理

注册监听:

MediaLib.getInstance().getMediaManagerObserve().registerXXXObserver(observer);

注销监听

MediaLib.getInstance().getMediaManagerObserve().unRegisterXXXObserver(observer);


XXX类型说明适用范围回调参数
NewAvChatApply用于监听音视频聊天发起,可在监听处理中启动音视频聊天页面,开始聊天流程单聊+群聊

NewAvChatApply

:isGroup是否群聊

:avChatType音频/视频

:avChatUuid  uuid

:creator

:attachData IM群id

:userInfoList成员列表

AvChatClose用于监听音视频聊天结束,监听被调用表示该聊天回话已结束,此时己方可关闭聊天单聊+群聊Long  uuid
AvChatReply用于监听音视频聊天成员对音视频请求的响应,有接受(Accept)、拒绝(Refuse)、忙(Busy)响应,以及用户接受邀请时重新指定的聊天类型(音频聊天/视频聊天)单聊+群聊

AvChatReply

:avChatcontroltype响应类型

:allowUsrId响应usrid

:avChatUuid uuid

:avChatTypeEnum响应者聊天类型

AvChatTypeSwitch用于监听音视频聊天成员的聊天类型(音频/视频)切换单聊+群聊

AvChatTypeSwitch

:userId成员id

:avChatUuid uuid

newAvChatType:聊天类型(音频、视频)

AvChatAddMember用于监听群聊新成员加入群聊

AvChatMemberOption

:avChatUuid uuid

:memberIdList新增成员列表

AvChatQuitMember用于监听群聊成员退出,群聊成员被踢出/挂断都会触发该回调群聊

AvChatMemberOption

:avChatUuid uuid

:memberIdList移除成员列表

DataSend用于监听己方音视频数据发送流量变化单聊+群聊

MediaDataInfo

:userid用户id

:dataLength 流量

DataReceive用于监听接收聊天成员音视频流量变化单聊+群聊

MediaDataInfo

:userid 用户id

:dataLength 流量


12.8 发起新聊天

发起人发起一个聊天回话时,指定对方usrList,以及聊天类型(单聊/群聊)、(音频/视频),创建成功后,服务器返回uuid,并对指定usrList发送NewAvChatApply通知

MediaLib.getInstance().getMediaManager().newAvChat(userIdList,true, avChatType,mGroupId)
.request(new IResponseCallback<NewAvChatResponse>() {
    @Override
            public void onSuccess(NewAvChatResponse data) {
        //请求成功后,服务端返回聊天的uuid,
        long avChatUuid = data . getAvChatUuid();
               //发起聊天成功后,需要自身响应Accept,接受新的聊天
MediaLib . getInstance() . getMediaManager() . sendAvChatControl(avChatUuid, AvChatControlType
 . ACCEPT, avChatTypeEnum) . 
        request(new IResponseCallback < Void>() {
            @Override
                    public void onSuccess(Void data) {

            }
                    @Override
                    public void onFailed(ResponseCode responseCode) {

            }
                });
                registerSignStateChangeListener(UISdk . getCurUserId());
                waitForTimeout(userIdList);
            }
}


12.9 响应聊天

指定目标聊天uuid,指定接受类型(Accept,Refuse,Busy),以及最终接受的聊天类型(音频/视频) 

MediaLib.getInstance().getMediaManager().sendAvChatControl(avChatUuid, avChatControlType,
avChatTypeEnum).request(new IResponseCallback<Void>() {
    @Override
            public void onSuccess(Void data) {

    }

            @Override
            public void onFailed(ResponseCode responseCode) {

    }
        });


12.10 切换聊天类型

切换聊天类型,在音频/视频见切换,调用成功后通知其他成员AvChatTypeSwitch

MediaLib.getInstance().getMediaManager().switchAvChatType(avChatUuid, newAvChatType)
.request(new IResponseCallback<Void>() {
    @Override
            public void onSuccess(Void data) {

    }

            @Override
            public void onFailed(ResponseCode responseCode) {

    }
        });


12.11 添加聊天成员

仅群聊可用,用于聊天过程中添加新成员,调用成功后,av服务器想新成员发送NewAvChatApply通知

MediaLib.getInstance().getMediaManager().addAvChatMember(uuid, addMemberIdLIst)
.request(new IResponseCallback<Void>() {
    @Override
            public void onSuccess(Void data) {

    }

            @Override
            public void onFailed(ResponseCode responseCode) {

    }
        });


12.12 移除聊天成员

仅群聊可用,指定目标uuid以及要移除的成员列表,调用成功后,av服务器将目标成员移除,并通知其余成员AvChatQuitMember

MediaLib.getInstance().getMediaManager().removeAvChatMember(uuid, removeMemberIdList)
.request(new IResponseCallback<Void>() {
    @Override
            public void onSuccess(Void data) {

    }

            @Override
            public void onFailed(ResponseCode responseCode) {

    }
        });


12.13 关闭聊天

关闭指定聊天回话,调用成功后通知其余成员AvChatClose

MediaLib.getInstance().getMediaManager().closeAvChat(avChatUuid)
.request(new IResponseCallback<Void>() {
    @Override
            public void onSuccess(Void data) {

    }

            @Override
            public void onFailed(ResponseCode responseCode) {

    }
        });


12.14 停止摄像头录制

MediaLib.getInstance().getMediaResourceManager().stopVideoCapture();


12.15 停止录音

该调用将停止录音采集,调用成功后他人无法接收到音频数据

MediaLib.getInstance().getMediaResourceManager().stopAudioCapture();


12.16 停止播放他人AV

MediaLib.getInstance().getMediaResourceManager().releaseAllAV();