IM
一. Android版本IM插件的介绍及导入
1. IM插件的介绍及结构
1.1.1 插件介绍
IM插件为开发者开发 IM 相关的应用提供的一套完善的开发框架,将IM基础能力和界面集成到aar文件中,方便开发者快速高效的集成IM通讯能力,开发者可以基于我们提供的IM插件实现自己的应用,也可以基于Demo开发。
1.1.2 插件结构
1.1.3 IM插件主要对外暴露类
1、AppMgr: 里面有登录/登出方法,注册/注销登陆状态的广播接收者;
2、IMPluginManager:里面主要有获取未读消息、发起群聊/单聊、IM全局的设置、获取IM全局设置状态的方法;
3、IMConfiguration:这个类为IM配置类,可以配置
1) IM通知消息的点击事件以及通知消息的图标、
2) 添加成员和转发消息的点击事件
3) 配置昵称和头像及点击
4) 聊天界面底部面板的扩展
5)华为推送的开关
4、IMPanel:这个类为聊天页面底部的扩展基类,可以设置扩展按钮的名字、icon及点击事件。
2. 引用插件
1、开发者主Module的build.gradle配置文件中添加如下代码
- android {
- //.........
- repositories {
- flatDir {
- dirs 'libs'
- }
- }
- }
2、在开发者主Module的libs里面添加需要的aar文件(如下图所示)
3、在开发者主Module的build.gradle配置文件中依赖导入的aar文件
注意事项:若之前集成过其他插件,已依赖如下某个aar文件,如
Yuntx_Android_Common_Plugin_v1.1.x,则无需再次依赖
- dependencies {
- // ........
- compile(name: 'Yuntx_Android_Biaoqingmm_Plugin_v1.1.x', ext: 'aar')
- compile(name: 'Yuntx_Android_Common_Plugin_v1.1.x', ext: 'aar')
- compile(name: 'Yuntx_Android_Dao_Plugin_v1.1.x', ext: 'aar')
- compile(name: 'Yuntx_Android_IM_Plugin_v1.1.x', ext: 'aar')
- compile(name: 'Yuntx_Android_Photopicker_Plugin_v1.1.x', ext: 'aar')
- // ........
- }
4、在开发者主Module的build.gradle配置文件中依赖如下第三方包
注意事项:如果之间已有以下某个第三方库,可使用原有的,也可以根据自己需求更换新的版本
- dependencies {
- // ........ x.x.x修改为 buildToolsVersion 同样的内容
- compile 'com.android.support:support-v4:x.x.x'
- compile 'com.android.support:appcompat-v7:x.x.x'
- compile 'org.jsoup:jsoup:1.10.1'
- compile 'io.reactivex:rxjava:1.1.1'
- compile 'io.reactivex:rxandroid:1.1.0'
- compile 'com.squareup.retrofit2:converter-gson:2.1.0'
- compile 'com.alibaba:fastjson:1.2.17'
- compile 'org.greenrobot:greendao:3.1.0'
- compile 'com.github.bumptech.glide:glide:3.6.1'
- compile 'com.belerweb:pinyin4j:2.5.1'
- compile ‘com.android.support:design:23.1.1'
- compile 'com.davemorrissey.labs:subsampling-scale-image-view:3.6.0'
- }
3. 配置工程
1.3.1 清单文件中权限申请
- // 开发者的 APP 接入时,请将 com.yuntongxun.imdemo 替换为自己的包名
- // 和下面的 uses-permission 一起加入到你的 AndroidManifest 文件中
- <permission
- android:name="com.yuntongxun.imdemo.permission.RECEIVE_MSG"
- android:protectionLevel="signature" />
- <uses-permission android:name="com.yuntongxun.imdemo.permission.RECEIVE_MSG" />
1.3.2 复制指定的类
请把下面的自定义广播类YuntxNotifyReceiver.java文件粘贴到开发者的module中,1.1.3版本把XiaoMiPushReceiver.java和 HuaWeiPushReceiver.java开放给开发者,便于开发者对推送的消息进行自定义的处理
1.3.3 注册自定义通知
注意事项:
1、如果之前集成过容联云的其他插件,已经注册过自定义YuntxNotifyReceiver,那么可以使用已注册过的,也可以重新按照以下流程注册。
2、本配置是属于application的属性,需要复制到AndroidManifest 清单文件的application节点内。
3、声明自定义通知的广播接收器,开发者需要把action 中的 com.yuntongxun.imdemo替换为自有项目APP的包名。
- // 声明自定义通知的广播接收器(需要替换包名,详见注意事项)
- <receiver
- android:name="YuntxNotifyReceiver在开发者module中的位置"
- android:exported="false">
- <intent-filter>
- // 接收push消息
- // action匹配规则{packageName + ".action" + "功能"}
- // com.yuntongxun.imdemo 替换成自己的报名
- // 以下三条action 可以根据自己需求来进行增删
- // 用于电话会议
- <action android:name="com.yuntongxun.imdemo.action.VOIP_CALL" />
- // 用于IM消息
- <action android:name="com.yuntongxun.imdemo.action.MESSAGE" />
- // 用于通知点击
- <action android:name="com.yuntongxun.imdemo.action.NOTIFICATION_CLICK" />
- </intent-filter>
- </receiver>
- // 应用处理程序逻辑服务 name为YuntxNotifyReceiver的位置加 $NotifyService
- <service android:name="YuntxNotifyReceiver的位置$NotifyService" />
1.3.4 集成小米、华为推送功能
1.3.4.1 导入华为小米推送SDK、推送接收类文件 (文件可以从Demo中提取)
1.3.4.2 华为小米推送清单文件配置
- <!-- 以下是华为的 -->
- <!-- 第三方相关 :接收Push消息(注册、Push消息、Push连接状态、标签,LBS上报结果)广播 -->
- <receiver android:name=".service.HuaWeiReceiver"
- android:exported="true">
- <intent-filter>
- <!-- 必须,用于接收token -->
- <action android:name="com.huawei.android.push.intent.REGISTRATION" />
- <!-- 必须,用于接收消息 -->
- <action android:name="com.huawei.android.push.intent.RECEIVE" />
- <!-- 可选,用于点击通知栏或通知栏上的按钮后触发onEvent回调 -->
- <action android:name="com.huawei.android.push.intent.CLICK" />
- <!-- 可选,查看push通道是否连接,不查看则不需要 -->
- <action android:name="com.huawei.intent.action.PUSH_STATE" />
- <!-- 可选,标签、地理位置上报回应,不上报则不需要 -->
- <action android:name="com.huawei.android.push.plugin.RESPONSE" />
- </intent-filter>
- <meta-data
- android:name="CS_cloud_ablitity"
- android:value="云通讯" />
- </receiver>
- <!--
- 备注:Push相关的android组件需要添加到业务的AndroidManifest.xml,
- Push相关android组件运行在另外一个进程是为了防止Push服务异常而影响主业务
- -->
- <!-- PushSDK:PushSDK接收外部请求事件入口 -->
- <receiver
- android:name="com.huawei.android.pushagent.PushEventReceiver"
- android:process=":hwpushservice">
- <intent-filter>
- <action android:name="com.huawei.android.push.intent.REFRESH_PUSH_CHANNEL" />
- <action android:name="com.huawei.intent.action.PUSH" />
- <action android:name="com.huawei.intent.action.PUSH_ON" />
- <action android:name="com.huawei.android.push.PLUGIN" />
- </intent-filter>
- <intent-filter>
- <action android:name="android.intent.action.PACKAGE_ADDED" />
- <action android:name="android.intent.action.PACKAGE_REMOVED" />
- <data android:scheme="package" />
- </intent-filter>
- </receiver>
- <receiver
- android:name="com.huawei.android.pushagent.PushBootReceiver"
- android:process=":hwpushservice">
- <intent-filter>
- <action android:name="com.huawei.android.push.intent.REGISTER" />
- <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
- </intent-filter>
- <meta-data
- android:name="CS_cloud_version"
- android:value="\u0032\u0037\u0030\u0035" />
- </receiver>
- <!-- PushSDK:Push服务 -->
- <service
- android:name="com.huawei.android.pushagent.PushService"
- android:process=":hwpushservice"/>
- <!-- 以下是小米的 -->
- <service
- android:name="com.xiaomi.push.service.XMPushService"
- android:enabled="true"
- android:process=":xmpushservice" />
- <service
- android:name="com.xiaomi.push.service.XMJobService"
- android:enabled="true"
- android:exported="false"
- android:permission="android.permission.BIND_JOB_SERVICE"
- android:process=":xmpushservice" />
- <!-- 注:此service必须在3.0.1版本以后(包括3.0.1版本)加入 -->
- <service
- android:name="com.xiaomi.mipush.sdk.PushMessageHandler"
- android:enabled="true"
- android:exported="true" />
- <service
- android:name="com.xiaomi.mipush.sdk.MessageHandleService"
- android:enabled="true" />
- <!-- 注:此service必须在2.2.5版本以后(包括2.2.5版本)加入 -->
- <receiver
- android:name="com.xiaomi.push.service.receivers.NetworkStatusReceiver"
- android:exported="true">
- <intent-filter>
- <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- </receiver>
- <receiver
- android:name="com.xiaomi.push.service.receivers.PingReceiver"
- android:exported="false"
- android:process=":xmpushservice">
- <intent-filter>
- <action android:name="com.xiaomi.push.PING_TIMER" />
- </intent-filter>
- </receiver>
- <!-- 小米广播 -->
- <receiver
- android:name=".service.XiaoMiPushReceiver"
- android:exported="true">
- <intent-filter>
- <action android:name="com.xiaomi.mipush.RECEIVE_MESSAGE" />
- </intent-filter>
- <intent-filter>
- <action android:name="com.xiaomi.mipush.MESSAGE_ARRIVED" />
- </intent-filter>
- <intent-filter>
- <action android:name="com.xiaomi.mipush.ERROR" />
- </intent-filter>
- </receiver>
1.3.4.3 调用华为小米推送API
请在Applicaiton的onCreate函数中调用华为小米API如下
二、IM插件初始化和配置
2.1 在onCreate()中初始化
注意事项:请开发者拷贝下面两句代码到自己的application的onCreate()方法中,此步骤是为保证用户的app在自动登陆模式中的数据完整,如果后续引入多个插件,可在DaoHelper.init()中传入对应的插件IDao参数,如new VoipDao(),new IMDao(), new CircleDao()等
- //初始化插件上下文
- SDKCoreHelper.setContext(this);
- //初始化数据库
- DaoHelper.init(this,new IMDao());
2.2 IM功能配置
2.2.1 功能配置简介
IM功能配置代码必须放置在开发者的application的onCreate()方法中,分为文档2.3.2必须配置和文档2.3.3建议配置。
文档2.3.1为代码编写方式示例,共有方法1到方法6六个方法,六个方法的详细使用方法见文档2.3.2和2.3.3介绍:
1) 推荐配置方式一
- /**
- * 推荐配置方式1 链式调用
- * 第一步 先创建 IMConfiguration的实例
- * 第二步 添加到IMPluginManager.getManager().init(IMConfiguration的实例)
- * 注意事项:下面的方法可以根据需求进行配置,详情见文档后面接口讲解
- */
- IMConfiguration imConfiguration = new IMConfiguration.IMConfigBuilder(this)
- /** 方法1 ↓ */
- .setOnNotificationClickListener(onNotificationClickListener)
- /** 方法2 ↓*/
- .setOnReturnIdsClickListener(onReturnIdsClickListener)
- /** 方法3 ↓*/
- .setOnIMBindViewListener(onIMBindViewListener)
- /** 方法4 ↓*/
- .imPanel(panel1,panel2)
- /** 方法5 ↓*/
- .notifyIcon(R.mipmap.ic_launcher)
- /** 方法6 ↓*/
- .setOnBindViewHolderListener(mBindViewHolderListner)
- /** 方法7 ↓*/
- .setOnMessagePreproccessListener(mOnMessagePreproccessListener)
- IMPluginManager.getManager().init(imConfiguration);
2) 推荐配置方式二
注意事项:推荐配置二 不再过多介绍,详见IMDemo中IMApplication中
- /**
- * 推荐配置方式 同为链式调用,但创建统一的接口实现类,在实现类中配置接口的方法
- * 第一步 先创建 IMConfiguration的实例
- * 第二步 添加到IMPluginManager.getManager().init(IMConfiguration的实例);
- * 注意事项:下面的方法可以根据需求进行配置,详情见文档后面接口讲解
- */
- IMConfiguration imConfiguration = new IMConfiguration.IMConfigBuilder(this)
- /** 方法1 ↓ */
- .setOnIMBindViewListener(IMManagerImpl.getInstance())
- /** 方法2 ↓ */
- .setOnNotificationClickListener(IMManagerImpl.getInstance())
- /** 方法3 ↓ */
- .setOnReturnIdsClickListener(IMManagerImpl.getInstance())
- /** 方法4 ↓ */
- .imPanel(panel1,panel2)
- /** 方法5 ↓ */
- .notifyIcon(R.drawable.ic_launcher)
- /** 方法6 ↓*/
- .setOnBindViewHolderListener(mBindViewHolderListner)
- /** 方法7 ↓*/
- .setOnMessagePreproccessListener(mOnMessagePreproccessListener)
- .build();
- IMPluginManager.getManager().init(imConfiguration);
2.2.2 必须配置
1)(方法1)配置IM通知消息点击事件
作用位置:
注意事项:点击事件中,开发者只需要配置好intent。指定跳转的页面及传递的数据,开发者不需要调用startActivity()
- private OnNotificationClickListener onNotificationClickListener =
- new OnNotificationClickListener() {
- /**
- * 此方法为 设置IM通知消息点击事件,如果不配置默认跳转到聊天页面
- * @param context
- * @param contactId 如果是单聊通知消息则是聊天对象的userID,若是群组消息则是groupID
- * @param intent 用来跳转页面的intent 开发者来指定跳转的页面
- */
- @Override
- public void onNotificationClick(Context context,String contactId,Intent intent) {
- // 代码示例,开发者只需要配置好intent,指定跳转的页面及传递的数据 开发者不需要调用startActivity()
- intent.setClassName(context,"com.example.erica.imdemo.MainActivity");
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- intent.putExtra("contactId", contactId);
- }
- };
提示:开发者在自己指定的页面可以根据contactID来再一次使用下面所示方法跳转到聊天页面,如此页面过渡会较为顺滑;也可以不进一步跳转,开发者可根据需求自定义。代码示例如下:
- String contactId = intent.getStringExtra("contactId");
- if (TextUtils.isEmpty(contactId)) {
- return;
- }
- /**
- * 获取到contactID后调用该方法,方法为自动判断是单聊还是群聊,然后打开页面
- */
- IMPluginManager.getManager().startChatting(mContext,contactId);
2)(方法2)配置添加成员和转发消息事件
作用位置(添加成员):
注意事项:单聊信息里的加号是为创建群组,群组信息里加号是添加群成员
作用位置(转发消息):
a 声明回调和设置监听事件(配置页面)
使用场景:先声明静态成员变量,返回id的回调onReturnIdsCallBack,然后设置监听事件
//返回Id的回调
public static OnReturnIdsCallback onReturnIdsCallback;
- //.........
- //设置 返回id 的监听事件
- private OnReturnIdsClickListener onReturnIdsClickListener =
- new OnReturnIdsClickListener() {
- /**
- * 此方法为 设置 返回id点击操作 (如添加成员 和 转发事件)点击事件
- * @param context
- * @param return_type RETURN_TYPE.ADDMEMBER_USERID 为 添加成员点击事件
- * RETURN_TYPE.TRANSMIT_CONTACTID 为 转发消息点击事件
- * @param callback 返回id 的回调
- * @param userIds 可变数组 加号点击时,单聊抛出聊天对象的id
- * 群聊抛出群组的所有成员的ids
- */
- @Override
- public void onReturnIdsClick(Context context, RETURN_TYPE return_type, OnReturnIdsCallback callback, String... userIds) {
- onReturnIdsCallback=callback;
- //当转发和增加群成员用于同个界面时,用当前枚举做判断
- if(return_type==RETURN_TYPE.ADDMEMBER_USERID){
- //跳转到开发者指定的添加成员的页面
- }else if(return_type==RETURN_TYPE.TRANSMIT_CONTACTID){
- //跳转到开发者指定的转发消息的页面
- }
- for (String userId : userIds) {
- LogUtil.i(userId + "");
- }
- }
- };
b 返回选取值(跳转页面)
注意事项:1、请开发者用 声明onReturnIdsCallBack 所在的applicaton名字替换下面方法中的IMApplication
2、调用该方法,可以传入字符串或者字符串数组,如果是转发消息,传入的字符串可以包括群组groupId和任意用户userID;如果是添加成员,传入的只能是任意用户userID
使用场景:点击添加成员或者转发信息按钮,跳转到开发者在onReturnIdsClick()指定的页面,选取需要转发消息或者添加成员的id后,调用该方法
- /**
- * 此方法是为 返回 转发消息对象 contactId
- * MainActivity代表 返回id回调 所在的页面
- */
- IMApplication.onReturnIdsCallback.returnIds(contactIds);
3)(方法3)配置昵称、头像及点击事件
作用位置:
使用场景:如果不配置方法3,那么默认把userId当做昵称,头像使用默认头像,头像默认不能点击
- //此方法为 初始化头像,昵称,头像点击事件的
- private OnIMBindViewListener onIMBindViewListener =
new OnIMBindViewListener() {
- /**
- * 此方法是为 设置聊天对象昵称
- * @param context
- * @param userId 聊天对象的userId
- */
- @Override
- public String onBindNickName(Context context, String userId) {
- //此处由开发者设置昵称,不设置则默认使用userId作为昵称
- //示例
- //userIdList为开发者的userId集合
- List<String> userIdList = new ArrayList<String>();
- for (String s : userIdList) {
- if (s == userId) {
- return "开发者查询后定义的昵称";
- }
- }
- return null;
- }
- /**
- * 此方法是为 配置聊天对象的头像
- * @param context
- * @param avatar 聊天对象 头像的显示控件 ImageView
- * @param userId 聊天对象的userId
- * @return 返回值为头像的 url 地址
- */
- @Override
- public String onBindAvatarByUrl(Context context, String userId) {
- //代码示例
- String url=HeadList.get(3);
- if(userId.equals("5555")){
- url=HeadList.get(0);
- }else if(userId.equals("4444")){
- url=HeadList.get(1);
- }
- return url ;
- }
- /**
- * 此方法是为 配置聊天对象的头像点击事件
- * @param context
- * @param userId 聊天对象的userId
- */
- @Override
- public void OnAvatarClickListener(Context context, String userId) {
- //此处由开发者设置头像点击事件,不设置则默认头像点击无效
- //示例
- Intent intent = new Intent();
- intent.setClassName(context, "com.yuntongxun.plugin.im.ui.contact.SinglePersonInfo");
- intent.putExtra("userId", userId);
- startActivity(intent);
- }
- };
2.2.3 建议配置
1)(方法4)聊天界面底部面板的扩展
作用位置:
使用场景:如果开发者需要扩展聊天页面底部面板的功能时,请在IMConfiguration中按照本步骤进行配置
a 创建IMPanel实例
- //此Bean是 聊天界面底部面板的基类
- IMPanel imPanel = new IMPanel
- /**
- * @params String panel 的名字
- * @params int 图片的资源id
- * @params int panel的类型 三种选择
- * IMPanel.PANELTYPE.SINGLECHAT, 表示添加到单聊
- * IMPanel.PANELTYPE.GROUPCHAT,表示添加到群聊
- * IMPanel.PANELTYPE.BOTH,表示两者均添加
- */
- .PanelBuilder("panel的名字", R.drawable.ic_launcher, IMPanel.PANELTYPE.GROUPCHAT)
- //此方法为 设置panel 点击事件
- .setOnIMPannelClickListener(new OnIMPanelClickListener() {
- /**
- * 此方法是为 设置扩展条目的 点击事件
- * @param context
- * @param contactId单聊时代表聊天对象的userId 群聊时代表群组的groupId
- */
- @Override
- public void onIMPannelClick(Context context, String contactId) {
- //此处开发者进行点击事件的处理 示例:
- ToastUtil.showMessage("测试");
- }
- }).build();
b 添加到addPanel()
- /**
- * 此方法为了 把开发者创建的IMPanel实例添加到聊天界面底部面板
- * @params ImPanel... 为可变数组,可填入多个IMPanel对象
- */
- .imPanel(imPanel)
2)(方法5)配置通知栏中消息图标
- /**
- * 此方法是为了 配置通知栏中的消息图标,不配置使用默认的
- * @param int 图片资源的Id
- */
- .notifyIcon("图片资源Id")
3)(方法6)自定义聊天列表UI接口
具体实现参考Demo(OnBindViewHolderListenerImpl.java)
- // 沟通列表和聊天列表的UI自定义接口
- .setOnBindViewHolderListener(mBindViewHolderListner)
- /**
- * This is the implementation of custom UI
- */
- private OnBindViewHolderListener mBindViewHolderListner = new OnBindViewHolderListenerImpl();
4)(方法7)设置消息转发接口
作用:当收到IM消息之后可以自定义实现该消息的处理方式(1.开发者处理该消息,2.交给插件内部处理)
- // IM消息转发接口
- .setOnMessagePreproccessListener(mOnMessagePreproccessListener)
- private OnMessagePreproccessListener mOnMessagePreproccessListener = new OnMessagePreproccessListener() {
- @Override
- public boolean dispatchMessage(ECMessage message) {
- // 返回true意义是消费当前这条消息不交给插件内部处理,返回false意义是交给插件进行处理
- if (message.getForm().equals("10086")) {
- LogUtil.d(TAG, "dispatchMessage 10086...");
- return true;
- }
- return false;
- }
- };
5) 配置未读消息数量改变的监听
作用位置:
注意事项:结合文档5.1使用
使用场景:如果开发者需要根据未读消息数量来更新某个界面(如ConversationActivity)的控件,那么该页面需要实现OnUpdateMsgUnreadCountsListener接口,在OnUpdateMsgUnreadCounts()中调用文档5.1后获取到消息数量,然后更新控件角标。
- /**
- * 此监听用于未读消息数量变化
- * 用法:需要根据未读消息数量来对界面UI刷新的页面实现
- * OnUpdateMsgUnreadCountsListener 此方法结合文档4.2.1使用
- */
- public class ConversationActivity extends Activity implements OnUpdateMsgUnreadCountsListener {
- @Override
- public void OnUpdateMsgUnreadCounts() {
- //里面调用方法获取未读消息数量之后,设置角标
- //示例:结合 获取未读消息使用
- int count = IMPluginManager.getManager().getUnReadMsgCount();
- unReadMsg.setText("未读消息=" + count);
- }
- //.........
- }
三、登录和登出
3.1 登录
注意事项:
如果接入前已经使用容联云的其他插件,如plugin_voip等,已配置过登录,那么无需再次登录,请直接跳转到可接入界面
如果要使用私有云,那么服务器的地址书写格式请参考IMDemo的assets目录下的文件(位置如下图所示)
3.1.1 登录
登录分两种模式:
1)强制登入
2)自动登入
1) 登入(强制登入/自动登入方式)
两个接口区别是强制登入需要传用户信息,自动登入的是使用上一次的用户信息登入
强制登入:一般用于App首次使用填写完用户账号密码之后使用 如下接口
注:公有云和专有云客户,第二个参数传null即可,私有云客户需要配置。
- SDKCoreHelper.login(builder.build(), "server_config_sd.xml");
自动登入:一般用于不需要进行用户账号密码填写应用主页地方使用 如下接口
- ClientUser.UserBuilder builder = new ClientUser.UserBuilder(account, name);
- builder.setAppKey("appId");// AppId
- builder.setAppToken("appToken");// AppToken
- builder.setPwd("userPassword");// Password可以不传,自动登录不校验密码
- if (AppMgr.getClientUser() != null) {
- LogUtil.d(TAG, "SDK auto connect...");
- SDKCoreHelper.init(getApplicationContext());
- }
完整登入逻辑代码如下(强制登入):
- ClientUser.UserBuilder builder = new ClientUser.UserBuilder(account, name);
- builder.setAppKey("appId");// AppId
- builder.setAppToken("appToken");// AppToken
- builder.setPwd("userPassword");// Password不为空情况即通讯账号密码登入
- // SDK连接登入
- //参数一:用户信息参数 参数二:配置私有云地址(传null即为公有云登入)
- SDKCoreHelper.login(builder.build(), "server_config_sd.xml");
3.1.2 获取登录状态
1) 注册获取登录状态的广播接收者
- IntentFilter intentFilter = new IntentFilter();
- intentFilter.addAction(SDKCoreHelper.ACTION_SDK_CONNECT);
- registerReceiver(mSDKNotifyReceiver, intentFilter);
- private BroadcastReceiver mSDKNotifyReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- if (SDKCoreHelper.ACTION_SDK_CONNECT.equals(intent.getAction())) {
- if (SDKCoreHelper.isLoginSuccess(intent)) {
- String pushToken = ECPreferences.getSharedPreferences().getString("pushToken", null);
- LogUtil.d(TAG, "SDK connect Success ,reportToken:" + pushToken);
- if (!TextUtils.isEmpty(pushToken)) {
- // 上报华为/小米推送设备token
- ECDevice.reportHuaWeiToken(pushToken);
- }
- // 初始化IM数据库
- DaoHelper.init(LoginActivity.this, new IMDao());
- } else {
- int error = intent.getIntExtra("error", 0);
- if (error == SdkErrorCode.CONNECTING) return;
- dismissDialog();
- LogUtil.e(TAG, "登入失败[" + error + "]");
- ToastUtil.showMessage("登入失败[" + error + "]");
- }
- }
- }
- };
2) 注销获取登录状态的广播接收者
- @Override
- protected void onDestroy() {
- super.onDestroy();
- // 注销广播
- unregisterReceiver(mSDKNotifyReceiver);
- }
3) 登录成功后立即初始化数据库
注意事项:代码必须写在实现了获知登录成功方法中如1)方法所示,如果后续引入多个插件,可在DaoHelper.init()中传入对应的插件IDao参数,如new VoipDao(),new IMDao(), new CircleDao()等,本步骤与2.1不重复,不重复,不重复,重要的事情……
- /**
- * 此方法为创建数据表并初始化数据库
- * @param context
- * @param IDao... IDao可变数组
- */
- DaoHelper.init(this, new IMDao());
3.1.3 获取异地登录状态
1) 注册获取异地登录状态的广播接收者
- IntentFilter intentFilter = new IntentFilter();
- intentFilter.addAction(SDKCoreHelper.ACTION_SDK_CONNECT);// SDK状态广播
- intentFilter.addAction(RongXInUtils.ACTION_KICK_OFF);// 账号异地登入广播
- private BroadcastReceiver mSDKNotifyReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- if (RongXInUtils.ACTION_KICK_OFF.equals(intent.getAction())) {
- //代码示例
- ToastUtil.showMessage("您的账号被他人登陆,请确定您的账号安全");
- startActivity(new Intent(MainActivity.this, LoginActivity.class));
- finish();
- }
- }
- };
2) 注销获取异地登录状态的广播接收者
- @Override
- protected void onDestroy() {
- super.onDestroy();
- // 注销广播
- unregisterReceiver(mSDKNotifyReceiver);
- }
3.2 登出
- /**
- * 此方法为退出当前登录账户
- */
- SDKCoreHelper.logout();
四、可接入界面
4.1 会话列表(ConversationListFragment)
IM插件提供会话列表(ConversationListFragment),开发者可根据需求接入在自己的项目中,使用示例:
- /**
- * 在开发者指定的activity中复制下面代码,
- * 会话列表如果需要topbar,那么putboolean()中传true
- */
- Bundle bundle = new Bundle();
- bundle.putBoolean(ConversationListFragment.EXTRA_SHOW_TITLE, false);
- Fragment mFragment = Fragment.instantiate(this,
- ConversationListFragment.class.getName(), bundle);
- getSupportFragmentManager()
- .beginTransaction()
- .add(R.id.convert_frame, mFragment)
- .commit();
效果图如下:
页面功能:
1、显示单聊或者群聊消息;
2、单击列表中Item进入对应的单聊或者群聊里面;
3、长按列表中Item,若是单聊会提示删除该聊天,群聊会提示删除该聊天和设置免打扰;
4、自动根据每个会话的未读消息的在列表对应的Item上显示未读数量;
5、其他功能。
4.2群组列表(GroupListFragment)
如果开发者需要群组列表,可接入IM插件中提供的GroupListFragment
使用示例:
/**
* 开发者在容器activity中按照一般fragment嵌入得方法使用
*/
getSupportFragmentManager().beginTransaction()
.add(R.id.convert_frame, Fragment.instantiate(this,
GroupListFragment.class.getName(), null)).commit();
其效果图如下图:
页面功能:
1、显示我的群组信息;
2、单击列表中Item进入对应的群组页面;
3、实时根据我的群组数量刷新页面显示的群组;
4、其他功能。
五、主动调用的方法
5.1 获取未读消息
注意事项:结合文档配置未读消息数量改变的监听使用
使用场景:1)在开发者完成文档配置未读消息数量改变的监听后,在OnUpdateMsgUnreadCounts()中调用改方法;
2) 需要获取未读消息的总数量时调用
- /**
- * 此方法可主动调用,用于获取全部未读消息的数量
- * @return 类型:int 作用:可提示的全部未读信息的数量
- */
- int unReadMsgCount = IMPluginManager.getManager().getUnReadMsgCount();
5.2 发起单聊
使用场景:开发者若需要和某人发起聊天,可主动调用该方法,需传入聊天对象的userId
- /**
- * 发起单聊
- * @param context 类型:上下文
- * @param userId 类型:String 传入:指定聊天对象的userID
- */
- IMPluginManager.getManager().startChatting(context,"与之聊天的userId");
5.3 发起群聊
使用场景:开发者若需要创建群组,可主动调用该方法,传入需要添加进群的userId的字符串集合或者数组,注意:无需传入创建者(自己)的userId
- /**
- * 此方法为发起群聊
- * @params Context 上下文
- * @params 第二个参数 可以为List<String> 也可以为 String[] 两者均盛装需添加进群的userId
- * @params OnCreateGroupStateListener 创建群组的状态监听器
- */
- IMPluginManager.getManager().startChatting(context, list, new OnCreateGroupStateListener() {
- // 创建开始
- @Override
- public void onStart() {
- // 开发者根据实际情况处理
- }
- // 创建成功
- @Override
- public void onSuccess(Context context, String groupId) {
- // 开发者根据实际情况处理
- }
- // 创建失败
- @Override
- public void onFailed() {
- // 开发者根据实际情况处理
- }
- });
5.4 根据groupID获取群成员
使用场景:譬如开发者在群聊页面底部面板添加发起视频会议按钮,选取发起视频对象前,可能需要知道本群的全部成员时,可调用此方法
- /**
- * @param groupID 群组的groupID
- */
- IMPluginManager.getManager().getGroupMember(groupID);
5.5 IM全局设置
作用位置:(此图为示例,实际页面应是开发者的设置页面)
注意事项:如果把1)接收新消息通知设置为false,那么2)声音提示新消息和3)震动提示新消息也会强制设置为false
使用场景:开发者应把这些设置放置在自己的某个页面内来进行全局设置IM,根据下面提供的方法来进行设置,并根据5.5来获取这些设置的状态,更新开发者的这些开关状态。true打开,false关闭,默认是true,
1) 接收新消息通知
- /**
- * 关闭/开启 消息通知
- * @param boolean 开启true 关闭false
- */
- IMPluginManager.getManager().setReceiveMessagesNotify(true);
2) 声音提示新消息
- /**
- * 接收到新消息时使用声音提醒,开启true 关闭false
- */
- IMPluginManager.getManager().useSoundToNotify(true);
3) 震动提示新消息
- /**
- * 接收到新消息时使用震动提醒,开启true 关闭false
- */
- IMPluginManager.getManager().useShakeToNotify(true);
4) 听筒/扬声器接听语音
- /**
- * 默认使用听筒播放声音,设置false后使用外音
- * @param value
- */
- IMPluginManager.getManager().useHandSetToPlayVoice(true);
5) 清除所有聊天记录
- /**
- * 清除所有聊天记录
- */
- IMPluginManager.getManager().clearAllChatRecord();
5.6 IM全局设置状态的获取
使用场景:开发者若需要获取下列设置的状态来配置自己的设置页面,则可以调用对应的方法对自己设置页面的控件更新
1) 获取接收新消息设置的状态
- /**
- * 获取 接收新消息设置 的状态 ture为打开,默认为true
- */
- boolean receiveMessagesNotifyState = IMPluginManager.getManager().getReceiveMessagesNotifyState();
2) 获取声音提示设置的状态
- /**
- * 获取 声音提示新消息设置 的状态 ture为打开,默认为true
- */
- boolean soundNotifyState = IMPluginManager.getManager().getSoundNotifyState();
3) 获取震动提示设置的状态
- /**
- * 获取 震动提示新消息设置 的状态 true为打开,默认为true
- */
- boolean shakeNotifyState = IMPluginManager.getManager().getShakeNotifyState();
4) 获取听筒接听语音设置的状态
- /**
- * 获取 听筒接收语音设置 的状态 true为打开,默认为true
- */
- boolean handSetSate = IMPluginManager.getManager().getHandSetSate();
六、更换UI
6.1 接口更换UI
1) topbar的背景颜色
IMConfiguration imConfiguration = new IMConfiguration.IMConfigBuilder(this)
//......
/**
*@param int 设置topbar的背景颜色
*/
.topBarBackgroundColorRecource(R.color.appid_color)
2) topbar的文字颜色
/**
* @param int 设置topbar的标题颜色
*/
.topBarTitleColorResource(R.color.ccp_green)
3) topbar副标题的文字颜色
/**
* @param int 设置tobar副标题的颜色
*/
.topBarSubTitleColorResource(R.color.ccp_green)
4) topbar右边文字的颜色
- /**
- * @param int 设置topbar右边文字的颜色
- */
- .topBarRightTextColorResource(R.color.ccp_green)
5) topbar左边的按钮
- /**
- * @param int 设置topbar左边按钮
- */
- .topBarLeftImageDrawableResource(R.drawable.ic_launcher)
6) 群聊页面右边的按钮
- /**
- * @param int 设置群聊页面topbar右边的按钮
- */
- .topBarGroupImageDrawableResource(R.drawable.emoji_1f3c1)
7) 单聊页面右边的按钮
- /**
- * @param int 设置单聊页面topbar右边的按钮
- */
- .topBarSingleImageDrawableResource(R.drawable.emoji_1f3c2)
8) 聊天页面系统提示布局的背景颜色
- /**
- * @param int 设置聊天页面系统提示布局的背景颜色
- */
- .chatTipsBackgroundColorResource(R.color.ccp_green)
9) 聊天页面系统提示文字的颜色
- /**
- * @param int 设置聊天页面系统文字的颜色
- */
- .chatTipsTextColorResource(R.color.white)
10) 成员的默认头像
- /**
- * @param int 设置成员的默认头像
- */
- .defaultAvaterResource(R.drawable.ic_launcher)
11) 群组的默认头像
- /**
- * @param int 设置群组的默认头像
- */
- .defaultGroupAvaterResource(R.drawable.ic_launcher)