关于环信即时通信的使用小结

本文总结了在Android项目中使用环信即时通信的步骤,包括AndroidManifest.xml的配置、库文件的导入、SDK的初始化,以及聊天列表的实时监听和接口实现。在UI交互中断时需要注意数据保存,建议参考环信demo来定制聊天adapter,以避免遗漏关键功能导致错误。
摘要由CSDN通过智能技术生成

因项目中涉及即时通讯的模块,老大跟我说用环信的,所以去熟悉了下后搬到项目中使用,环信文档地址点击打开链接

首先应该在AndroidManifest.xml文件中配置环信相关

 <!-- 设置环信应用的appkey -->
    	<meta-data android:name="EASEMOB_APPKEY"  android:value="easemob-demo#chatdemoui" />
    	<!-- 声明sdk所需的service SDK核心功能-->
    	<service android:name="com.easemob.chat.EMChatService" />
    	<!-- 百度地图start -->
        <service
            android:name="com.baidu.location.f"
            android:enabled="true"
            android:process=":remote" >
            <intent-filter>
                <action android:name="com.baidu.location.service_v2.2" >
                </action>
            </intent-filter>
        </service>

因为项目中只用到单聊的相关,所以只简单记录下重点的

先导入easemobchat_2.2.1.jar和libeasemob_jni.so、libeasemobservice.so库文件

使用前应该在application中初始化

// 初始化环信SDK,一定要先调用init()
        EMChat.getInstance().init(context);

获取聊天列表时要加入实时监听并实现接口EMEventListener

EMChatManager.getInstance().addConnectionListener(connectionListener);
EMContactManager.getInstance().setContactListener(new MyContactListener());

/**
	 * 连接监听listener
	 * 
	 */
	public class MyConnectionListener implements EMConnectionListener {

		@Override
		public void onConnected() {
            boolean contactSynced = HXSDKHelper.getInstance().isContactsSyncedWithServer();
            
            // in case group and contact were already synced, we supposed to notify sdk we are ready to receive the events
            if( contactSynced){
                new Thread(){
                    @Override
                    public void run(){
                        HXSDKHelper.getInstance().notifyForRecevingEvents();
                    }
                }.start();
            }else{
                
                if(!contactSynced){
                    asyncFetchContactsFromServer();
                }
                
                if(!HXSDKHelper.getInstance().isBlackListSyncedWithServer()){
                    asyncFetchBlackListFromServer();
                }
            }
            
		}

		@Override
		public void onDisconnected(final int error) {
//			final String st1 = getResources().getString(R.string.can_not_connect_chat_server_connection);
//			final String st2 = getResources().getString(R.string.the_current_network);
			runOnUiThread(new Runnable() {

				@Override
				public void run() {
					if (error == EMError.USER_REMOVED) {
						// 显示帐号已经被移除
//						showAccountRemovedDialog();
					} else if (error == EMError.CONNECTION_CONFLICT) {
						// 显示帐号在其他设备登陆dialog
//						showConflictDialog();
					} else {
//						if (NetUtils.hasNetwork(MainActivity.this))
//							chatHistoryFragment.errorText.setText(st1);
//						else
//							chatHistoryFragment.errorText.setText(st2);

					}
				}

			});
		}
	}

private InviteMessgeDao inviteMessgeDao;
	private UserDao userDao;

	/***
	 * 好友变化listener
	 * 
	 */
	public class MyContactListener implements EMContactListener {

		@Override
		public void onContactAdded(List<String> usernameList) {			
			// 保存增加的联系人
			Map<String, User> localUsers = WuerbaApplication.getInstance().getContactList();
			Map<String, User> toAddUsers = new HashMap<String, User>();
			for (String username : usernameList) {
				User user = setUserHead(username);
				// 添加好友时可能会回调added方法两次
				if (!localUsers.containsKey(username)) {
					userDao.saveContact(user);
				}
				toAddUsers.put(username, user);
			}
			localUsers.putAll(toAddUsers);

		}

		@Override
		public void onContactDeleted(final List<String> usernameList) {
			// 被删除
			Map<String, User> localUsers = WuerbaApplication.getInstance().getContactList();
			for (String username : usernameList) {
				localUsers.remove(username);
				userDao.deleteContact(username);
				inviteMessgeDao.deleteMessage(username);
			}
			runOnUiThread(new Runnable() {
				public void run() {
					// 如果正在与此用户的聊天页面
					String st10 = getResources().getString(R.string.have_you_removed);
					if (ChatActivity.activityInstance != null
							&& usernameList.contains(ChatActivity.activityInstance.getToChatUsername())) {
						Toast.makeText(MainActivity.this, ChatActivity.activityInstance.getToChatUsername() + st10, 1)
								.show();
						ChatActivity.activityInstance.finish();
					}
					updateUnreadLabel();
					// 刷新ui
					mUserTabTwoFragment.refresh();
				}
			});

		}

		@Override
		public void onContactInvited(String username, String reason) {
			
			// 接到邀请的消息,如果不处理(同意或拒绝),掉线后,服务器会自动再发过来,所以客户端不需要重复提醒
			List<InviteMessage> msgs = inviteMessgeDao.getMessagesList();

			for (InviteMessage inviteMessage : msgs) {
				if (inviteMessage.getGroupId() == null && inviteMessage.getFrom().equals(username)) {
					inviteMessgeDao.deleteMessage(username);
				}
			}
			// 自己封装的javabean
			InviteMessage msg = new InviteMessage();
			msg.setFrom(username);
			msg.setTime(System.currentTimeMillis());
			msg.setReason(reason);
			Log.d("onContactInvited", username + "请求加你为好友,reason: " + reason);
			// 设置相应status
			msg.setStatus(InviteMesageStatus.BEINVITEED);

		}

		@Override
		public void onContactAgreed(String username) {
			List<InviteMessage> msgs = inviteMessgeDao.getMessagesList();
			for (InviteMessage inviteMessage : msgs) {
				if (inviteMessage.getFrom().equals(username)) {
					return;
				}
			}
			// 自己封装的javabean
			InviteMessage msg = new InviteMessage();
			msg.setFrom(username);
			msg.setTime(System.currentTimeMillis());
			Log.d("", username + "同意了你的好友请求");
			msg.setStatus(InviteMesageStatus.BEAGREED);

		}

		@Override
		public void onContactRefused(String username) {
			
			// 参考同意,被邀请实现此功能,demo未实现
			Log.d(username, username + "拒绝了你的好友请求");
		}

	}

在onresume中设置事件监听
@Override
	protected void onResume() {
		super.onResume();
		if (!isConflict && !isCurrentAccountRemoved) {
			updateUnreadLabel();
			EMChatManager.getInstance().activityResumed();
		}

		// unregister this event listener when this activity enters the
		// background
		ChatHXSDKHelper sdkHelper = (ChatHXSDKHelper) ChatHXSDKHelper.getInstance();
		sdkHelper.pushActivity(this);

		// register the event listener when enter the foreground
		EMChatManager.getInstance().registerEventListener(this,
				new EMNotifierEvent.Event[] { EMNotifierEvent.Event.EventNewMessage ,EMNotifierEvent.Event.EventOfflineMessage, EMNotifierEvent.Event.EventConversationListChanged});
	}

在ui被打断时保存

@Override
	protected void onSaveInstanceState(Bundle outState) {
		outState.putBoolean("isConflict", isConflict);
		outState.putBoolean(UIHelper.ACCOUNT_REMOVED, isCurrentAccountRemoved);
		super.onSaveInstanceState(outState);
	}


在ui销毁时设置注销监听

@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();

		if(connectionListener != null){
		    EMChatManager.getInstance().removeConnectionListener(connectionListener);
		}
	}

@Override
	protected void onStop() {
		EMChatManager.getInstance().unregisterEventListener(this);
		ChatHXSDKHelper sdkHelper = (ChatHXSDKHelper) ChatHXSDKHelper.getInstance();
		sdkHelper.popActivity(this);

		super.onStop();
	}

具体的聊天可参考环信的demo ,ps:直接拷贝她的聊天adapter到自己项目中进行修改最为简洁,否则容易漏掉某些地方而导致报错



  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值