关于环信即时通信的使用小结
2015-08-11 17:06
232 查看
因项目中涉及即时通讯的模块,老大跟我说用环信的,所以去熟悉了下后搬到项目中使用,环信文档地址点击打开链接
首先应该在AndroidManifest.xml文件中配置环信相关
因为项目中只用到单聊的相关,所以只简单记录下重点的
先导入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());
在onresume中设置事件监听
在ui被打断时保存
在ui销毁时设置注销监听
具体的聊天可参考环信的demo ,ps:直接拷贝她的聊天adapter到自己项目中进行修改最为简洁,否则容易漏掉某些地方而导致报错
首先应该在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到自己项目中进行修改最为简洁,否则容易漏掉某些地方而导致报错
相关文章推荐
- 高级查询与索引
- [Linux]查看系统信息方法汇总
- JAVA,Play framework 入门,打印hello word
- 欢迎使用CSDN-markdown编辑器
- 安慰奶牛 解题报告
- Android开发者必知的5个开源库
- 按Home按键退出应用后重新启动该应用无法返回到最后打开页面的解决方案
- MySQL Study之--Percona Server版本
- eclipse Android关联源码
- 使用 getopts 处理命令行参数
- Intent Action 大全
- 黑马程序员————IO流(2)
- 让你的webview在应用里面跳并且显示正在加载
- 理解 Linux 配置文件【转】
- 【cl】cmd相关命令
- android--intent
- 有关功放输入端的探究
- 数据和表结构完全一样的两个表,查询性能相差一倍多
- PullScrollView进阶(二)----->图片下拉回弹(简易QQ空间下拉效果)
- HDU 5375 Gray code