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

论坛 期权论坛 脚本     
匿名网站用户   2020-12-19 23:22   11   0

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

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

  1. <!--设置环信应用的appkey-->
  2. <meta-dataandroid:name="EASEMOB_APPKEY"android:value="easemob-demo#chatdemoui"/>
  3. <!--声明sdk所需的serviceSDK核心功能-->
  4. <serviceandroid:name="com.easemob.chat.EMChatService"/>
  5. <!--百度地图start-->
  6. <service
  7. android:name="com.baidu.location.f"
  8. android:enabled="true"
  9. android:process=":remote">
  10. <intent-filter>
  11. <actionandroid:name="com.baidu.location.service_v2.2">
  12. </action>
  13. </intent-filter>
  14. </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());

  1. /**
  2. *连接监听listener
  3. *
  4. */
  5. publicclassMyConnectionListenerimplementsEMConnectionListener{
  6. @Override
  7. publicvoidonConnected(){
  8. booleancontactSynced=HXSDKHelper.getInstance().isContactsSyncedWithServer();
  9. //incasegroupandcontactwerealreadysynced,wesupposedtonotifysdkwearereadytoreceivetheevents
  10. if(contactSynced){
  11. newThread(){
  12. @Override
  13. publicvoidrun(){
  14. HXSDKHelper.getInstance().notifyForRecevingEvents();
  15. }
  16. }.start();
  17. }else{
  18. if(!contactSynced){
  19. asyncFetchContactsFromServer();
  20. }
  21. if(!HXSDKHelper.getInstance().isBlackListSyncedWithServer()){
  22. asyncFetchBlackListFromServer();
  23. }
  24. }
  25. }
  26. @Override
  27. publicvoidonDisconnected(finalinterror){
  28. //finalStringst1=getResources().getString(R.string.can_not_connect_chat_server_connection);
  29. //finalStringst2=getResources().getString(R.string.the_current_network);
  30. runOnUiThread(newRunnable(){
  31. @Override
  32. publicvoidrun(){
  33. if(error==EMError.USER_REMOVED){
  34. //显示帐号已经被移除
  35. //showAccountRemovedDialog();
  36. }elseif(error==EMError.CONNECTION_CONFLICT){
  37. //显示帐号在其他设备登陆dialog
  38. //showConflictDialog();
  39. }else{
  40. //if(NetUtils.hasNetwork(MainActivity.this))
  41. //chatHistoryFragment.errorText.setText(st1);
  42. //else
  43. //chatHistoryFragment.errorText.setText(st2);
  44. }
  45. }
  46. });
  47. }
  48. }

  1. privateInviteMessgeDaoinviteMessgeDao;
  2. privateUserDaouserDao;
  3. /***
  4. *好友变化listener
  5. *
  6. */
  7. publicclassMyContactListenerimplementsEMContactListener{
  8. @Override
  9. publicvoidonContactAdded(List<String>usernameList){
  10. //保存增加的联系人
  11. Map<String,User>localUsers=WuerbaApplication.getInstance().getContactList();
  12. Map<String,User>toAddUsers=newHashMap<String,User>();
  13. for(Stringusername:usernameList){
  14. Useruser=setUserHead(username);
  15. //添加好友时可能会回调added方法两次
  16. if(!localUsers.containsKey(username)){
  17. userDao.saveContact(user);
  18. }
  19. toAddUsers.put(username,user);
  20. }
  21. localUsers.putAll(toAddUsers);
  22. }
  23. @Override
  24. publicvoidonContactDeleted(finalList<String>usernameList){
  25. //被删除
  26. Map<String,User>localUsers=WuerbaApplication.getInstance().getContactList();
  27. for(Stringusername:usernameList){
  28. localUsers.remove(username);
  29. userDao.deleteContact(username);
  30. inviteMessgeDao.deleteMessage(username);
  31. }
  32. runOnUiThread(newRunnable(){
  33. publicvoidrun(){
  34. //如果正在与此用户的聊天页面
  35. Stringst10=getResources().getString(R.string.have_you_removed);
  36. if(ChatActivity.activityInstance!=null
  37. &&usernameList.contains(ChatActivity.activityInstance.getToChatUsername())){
  38. Toast.makeText(MainActivity.this,ChatActivity.activityInstance.getToChatUsername()+st10,1)
  39. .show();
  40. ChatActivity.activityInstance.finish();
  41. }
  42. updateUnreadLabel();
  43. //刷新ui
  44. mUserTabTwoFragment.refresh();
  45. }
  46. });
  47. }
  48. @Override
  49. publicvoidonContactInvited(Stringusername,Stringreason){
  50. //接到邀请的消息,如果不处理(同意或拒绝),掉线后,服务器会自动再发过来,所以客户端不需要重复提醒
  51. List<InviteMessage>msgs=inviteMessgeDao.getMessagesList();
  52. for(InviteMessageinviteMessage:msgs){
  53. if(inviteMessage.getGroupId()==null&&inviteMessage.getFrom().equals(username)){
  54. inviteMessgeDao.deleteMessage(username);
  55. }
  56. }
  57. //自己封装的javabean
  58. InviteMessagemsg=newInviteMessage();
  59. msg.setFrom(username);
  60. msg.setTime(System.currentTimeMillis());
  61. msg.setReason(reason);
  62. Log.d("onContactInvited",username+"请求加你为好友,reason:"+reason);
  63. //设置相应status
  64. msg.setStatus(InviteMesageStatus.BEINVITEED);
  65. }
  66. @Override
  67. publicvoidonContactAgreed(Stringusername){
  68. List<InviteMessage>msgs=inviteMessgeDao.getMessagesList();
  69. for(InviteMessageinviteMessage:msgs){
  70. if(inviteMessage.getFrom().equals(username)){
  71. return;
  72. }
  73. }
  74. //自己封装的javabean
  75. InviteMessagemsg=newInviteMessage();
  76. msg.setFrom(username);
  77. msg.setTime(System.currentTimeMillis());
  78. Log.d("",username+"同意了你的好友请求");
  79. msg.setStatus(InviteMesageStatus.BEAGREED);
  80. }
  81. @Override
  82. publicvoidonContactRefused(Stringusername){
  83. //参考同意,被邀请实现此功能,demo未实现
  84. Log.d(username,username+"拒绝了你的好友请求");
  85. }
  86. }

在onresume中设置事件监听
  1. @Override
  2. protectedvoidonResume(){
  3. super.onResume();
  4. if(!isConflict&&!isCurrentAccountRemoved){
  5. updateUnreadLabel();
  6. EMChatManager.getInstance().activityResumed();
  7. }
  8. //unregisterthiseventlistenerwhenthisactivityentersthe
  9. //background
  10. ChatHXSDKHelpersdkHelper=(ChatHXSDKHelper)ChatHXSDKHelper.getInstance();
  11. sdkHelper.pushActivity(this);
  12. //registertheeventlistenerwhenentertheforeground
  13. EMChatManager.getInstance().registerEventListener(this,
  14. newEMNotifierEvent.Event[]{EMNotifierEvent.Event.EventNewMessage,EMNotifierEvent.Event.EventOfflineMessage,EMNotifierEvent.Event.EventConversationListChanged});
  15. }

在ui被打断时保存

  1. @Override
  2. protectedvoidonSaveInstanceState(BundleoutState){
  3. outState.putBoolean("isConflict",isConflict);
  4. outState.putBoolean(UIHelper.ACCOUNT_REMOVED,isCurrentAccountRemoved);
  5. super.onSaveInstanceState(outState);
  6. }


在ui销毁时设置注销监听

  1. @Override
  2. protectedvoidonDestroy(){
  3. //TODOAuto-generatedmethodstub
  4. super.onDestroy();
  5. if(connectionListener!=null){
  6. EMChatManager.getInstance().removeConnectionListener(connectionListener);
  7. }
  8. }

  1. @Override
  2. protectedvoidonStop(){
  3. EMChatManager.getInstance().unregisterEventListener(this);
  4. ChatHXSDKHelpersdkHelper=(ChatHXSDKHelper)ChatHXSDKHelper.getInstance();
  5. sdkHelper.popActivity(this);
  6. super.onStop();
  7. }

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

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:1136255
帖子:227251
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP