因项目中涉及即时通讯的模块,老大跟我说用环信的,所以去熟悉了下后搬到项目中使用,环信文档地址点击打开链接
首先应该在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到自己项目中进行修改最为简洁,否则容易漏掉某些地方而导致报错