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)