您的位置:首页 > 其它

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

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

首先应该在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到自己项目中进行修改最为简洁,否则容易漏掉某些地方而导致报错
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: