Android 环信集成使用总结

最近因为项目需要,需要集成环信,对于一些账号的注册,配置的添加官方文档上写的都有,就不在记录。就记录一下集成过程中遇到的问题。环信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<EMMessage> 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:
<LinearLayout
		android:id="@+id/conversation_no_data"
		android:layout_width="match_parent"
		android:layout_height="match_parent"
		android:orientation="vertical"
		android:gravity="center"
		android:background="#ffffff"
		android:layout_below="@id/title_bar"
		>
		<ImageView
			android:id="@+id/iv_empty_retry_view"
			android:layout_width="170dp"
			android:layout_height="170dp"
			android:layout_centerInParent="true"
			android:layout_gravity="center"
			android:background="@drawable/empty_message"
			android:scaleType="fitXY" />

		<TextView
			android:id="@+id/tv_empty_msg"
			android:layout_width="wrap_content"
			android:layout_height="wrap_content"
			android:textSize="18sp"
			android:textColor="#4D4D4D"
			android:text="暂无消息"
			android:layout_below="@+id/iv_empty_retry_view"
			android:layout_marginTop="25dp" />
	</LinearLayout>

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<EMGroup> grouplist = EMClient.getInstance().groupManager().getJoinedGroupsFromServer();//需异步处理
//从本地加载群组列表
List<EMGroup> 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);
要在Android应用程序中集成环信EaseIMKit来发送语音,需要遵循以下步骤: 1. 在项目的build.gradle文件中添加环信库的依赖: ``` dependencies { // 环信IM SDK implementation 'com.hyphenate:chat-sdk:3.5.2' // 环信UI库 implementation 'com.hyphenate:chat-ui-sdk:3.5.2' } ``` 2. 在AndroidManifest.xml文件中声明必要的权限: ``` <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.VIBRATE" /> ``` 3. 在你的Activity中创建EaseChatFragment实例,并将其添加到布局中: ``` <fragment android:id="@+id/chat_fragment" android:name="com.hyphenate.easeui.ui.EaseChatFragment" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@+id/top_bar" android:background="@color/white" app:layout_behavior="@string/appbar_scrolling_view_behavior" app:layout_scrollFlags="scroll|exitUntilCollapsed" app:layout_anchor="@id/top_bar" app:layout_anchorGravity="bottom|center_horizontal" /> ``` 4. 在Activity中初始化EaseChatFragment,并设置相关属性: ``` private void initChatFragment() { // 获取EaseChatFragment实例 EaseChatFragment chatFragment = (EaseChatFragment) getSupportFragmentManager().findFragmentById(R.id.chat_fragment); // 设置聊天界面的标题 chatFragment.setTitle("Chat with xxx"); // 设置聊天对象的ID chatFragment.setArguments(getIntent().getExtras()); // 设置是否开启语音消息发送功能 chatFragment.setShowRecord(true); } ``` 5. 在EaseChatFragment中实现发送语音消息的逻辑: ``` // 在EaseChatFragment中重写onSendVoice方法 @Override public void onSendVoice(String filePath, int length) { // 创建语音消息 EMVoiceMessageBody messageBody = new EMVoiceMessageBody(new File(filePath), length); EMMessage message = EMMessage.createVoiceSendMessage(filePath, length, toChatUsername); // 发送语音消息 sendMessage(message); } ``` 以上就是使用环信EaseIMKit实现Android发送语音消息的步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值