最近因为项目需要,需要集成环信,对于一些账号的注册,配置的添加官方文档上写的都有,就不在记录。就记录一下集成过程中遇到的问题。环信demo中的代码太乱,而且一些功能用不到,我们就移值些自己有用的放到自己的项目中。
1.消息监听
环信在收到消息后我们通过设置EMMessageListener
,然后在其回调中就可以监听到变化。这个回调是哪个界面需要的时候,就在哪个界面注册监听器,环信的demo中application,MainActivity,chatFragment都进行了监听的回调,他的application中的回调中主要是:
if(!easeUI.hasForegroundActivies()){
getNotifier().notify(message);
}
这部分是判断注册监听的界面是否在前台,而不是整个应用是否在前台。easyui中每个注册监听的界面,它都会通过sdkHelper.pushActivity(this);
保存起来,然后在onPause中sdkHelper.popActivity(this)
出去,然后就由easeUI.hasForegroundActivies()中的list的长度判断是否在前台。对于自己的项目则进行了部分的修改,当应用在前台时,通过eventbus发送消息,然后到对应的界面处理,因为觉的用回调的方式代码有点乱,所以就用了eventbus,如果不用eventbus的话,也可以使用注册回调的方式进行消息的处理。就像demo中MainActivity在onPause,onResume中分别注册和取消监听,然后在其界面中的EMMessageListener
的回调中进行处理,当应用不在前台时仍然发送通知。接收到消息时的部分处理代码如下:
@Override
public void onMessageReceived(List messages) {
for (EMMessage message : messages) {
if(EasyUtils.isAppRunningForeground(mContext)){
LogUtils.d("应用在前台");
EventManager.post(Constant.EB_MSG_CHANGE,message);
}else{
LogUtils.d("应用在后台");
EaseUI.getInstance().getNotifier().vibrateAndPlayTone(message);
EaseUI.getInstance().getNotifier().notify(message);
}
}
}
2.联系人监听
这里感觉需要注意的就是,1.数据库进行联系人信息的保存,2.联系人信息变化的监听.3.增删联系人的监听。 联系人通过数据库进行维护,项目中采用greendao进行联系人信息的维护,这里在登录成功后建立对应的表保存其联系人数据即可。对于联系人信息变化的监听同样把只EMContactListener
的注册回调放在application中,在联系人增加或者删除时,只要对数据库进行相应的操作即可,然后再通过EventBus发送对应的消息到不同的界面。有一点感觉需要注意的就是:EaseContactListFragment
中有一个方法 onHiddenChanged
,因为联系人界面所在的fragment是通过show,hide控制显示隐藏的,frgamentfragment的生命周期不在执行,所以如果收不到消息的监听时,我们就可以通过这个方法进行界面的刷新。
3.同步联系人信息
当应用在运行的时候我们可以收到联系人信息的变化,当应用被杀死时,不会收到。然后我们就可以看到在demohelper中每次都会进行联系人和群组的同步,这里仍然时通过getAllContactsFromServer
这个api获取到所有联系人的信息,然后对数据库进行更新或者插入操作。这里复杂在一些判断条件,例如是否登录,是否正在同步等,具体的详情参考demo中即可,把一些不必要的删掉就行。
4.群组信息处理
群组监听同样通过EMGroupChangeListener
就可以。参考demo中,我们在对应不同的回调方法里发送相应的通知,然后刷新对应的界面即可。同样要注意也要在初始化时添加群组信息的同步。我们在登录成功后和同步时调用
EMClient.getInstance().groupManager().getJoinedGroupsFromServer()
注意一点,这个api需要放入子线程中。然后我们就可以通过下列方法来刷新本地群组列表
EMClient.getInstance().groupManager().getAllGroups()
5.头像显示
ui给出的设计的头像是圆形的,因为项目依赖的是easeui,本想着直接在easeui中修改头像控件,后来看到环信的EaseImageView本身就提供的有设置radius的api,查询后得知可以通过在application中初始化的时候设置EaseUI的属性来改变头像的角度,具体代码如下:
//设置头像为圆形
EaseAvatarOptions avatarOpts = new EaseAvatarOptions();
//0:默认,1:圆形,2:矩形
avatarOpts.setAvatarShape(1);
//设置角度
avatarOpts.setAvatarRadius(30);
EaseUI.getInstance().setAvatarOptions(avatarOpts);
6.消息列表没数据时显示空布局
在我们平时做的项目中对于一些recycleview或者listview,在没有数据时我们会展示一些空布局,如果是我们自定义的布局,我们可以根据一些第三方框架显示不同的布局,对于easeui,我们就采用最简单的在布局中加上Relativelayout 根据list的长度是否为0,来控制空布局的显示与隐藏。我们在EaseConversationListFragment对应的xml中加上,然后在EaseConversationListFragment中加上判断即可
EaseConversationListFragment:
if (conversationList.size()==0){
getView().findViewById(R.id.conversation_no_data).setVisibility(View.VISIBLE);
}else{
getView().findViewById(R.id.conversation_no_data).setVisibility(View.GONE);
}
ease_fragment_conversation_list:
7.修改聊天布局
我们知道EaseChatInputMenu—ease_widget_chat_input_menu.xml
是easeui中的聊天底部输入栏, 他里面有 它里面对应三部分:
底部EditText输入框所在布局:
EaseChatPrimaryMenu:
ease_widget_chat_primary_menu.xml
表情所在布局:
EaseEmojiconMenu:
ease_widget_chat_input_menu.xml
ease_expression_gridview.xml
拍照,图片等选择所在布局:
EaseChatExtendMenu:
ease_chat_menu_item.xml
我们如果需要修改,到不同的布局里修改成我们需要的样式即可
8.项目中有群聊的功能,群聊列表界面主要对应demo中的GroupsActivity,在GroupsActivity中我们根据环信的接口文档得知主要用两个方法:
//从服务器获取自己加入的和创建的群组列表,此api获取的群组sdk会自动保存到内存和db。
List grouplist = EMClient.getInstance().groupManager().getJoinedGroupsFromServer();//需异步处理
//从本地加载群组列表
List grouplist = EMClient.getInstance().groupManager().getAllGroups();
然后我们根据这两个api就可以实现我们的群聊列表界面。
9.多设备处理
当在其他设备上登陆时,环信会回调EMConnectionListener
中的onDisconnected方法,当我们的应用没有被杀死时,我们监听到连接中断时,我们则跳转到LoginActivity提示dialog重新登录。当我们被杀死后,再次进入应用会重新初始化连接,不会因为连接中断导致消息发送不出去。
我的监听放在application中,然后根据不同的状态吗进行不同的监听,在监听到之后先调用退出登录接口,然后跳转到登录界面,并传过去对应的提示语。
HuanXinHelper.getInstance().logout(false,null);
Intent intent = new Intent(mContext, LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra(Constant.INTENT_ACCOUNT_CONFLICT, true);
intent.putExtra(Constant.INTENT_DISCONNECT_CODE, errorCode);