因项目中涉及即时通讯的模块,老大跟我说用环信的,所以去熟悉了下后搬到项目中使用,环信文档地址点击打开链接
首先应该在AndroidManifest.xml文件中配置环信相关
-
-
<meta-dataandroid:name="EASEMOB_APPKEY"android:value="easemob-demo#chatdemoui"/>
-
-
<serviceandroid:name="com.easemob.chat.EMChatService"/>
-
-
<service
-
android:name="com.baidu.location.f"
-
android:enabled="true"
-
android:process=":remote">
-
<intent-filter>
-
<actionandroid: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());
-
-
-
-
-
publicclassMyConnectionListenerimplementsEMConnectionListener{
-
-
@Override
-
publicvoidonConnected(){
-
booleancontactSynced=HXSDKHelper.getInstance().isContactsSyncedWithServer();
-
-
-
if(contactSynced){
-
newThread(){
-
@Override
-
publicvoidrun(){
-
HXSDKHelper.getInstance().notifyForRecevingEvents();
-
}
-
}.start();
-
}else{
-
-
if(!contactSynced){
-
asyncFetchContactsFromServer();
-
}
-
-
if(!HXSDKHelper.getInstance().isBlackListSyncedWithServer()){
-
asyncFetchBlackListFromServer();
-
}
-
}
-
-
}
-
-
@Override
-
publicvoidonDisconnected(finalinterror){
-
-
-
runOnUiThread(newRunnable(){
-
-
@Override
-
publicvoidrun(){
-
if(error==EMError.USER_REMOVED){
-
-
-
}elseif(error==EMError.CONNECTION_CONFLICT){
-
-
-
}else{
-
-
-
-
-
-
}
-
}
-
-
});
-
}
-
}
-
privateInviteMessgeDaoinviteMessgeDao;
-
privateUserDaouserDao;
-
-
/***
-
*好友变化listener
-
*
-
*/
-
publicclassMyContactListenerimplementsEMContactListener{
-
-
@Override
-
publicvoidonContactAdded(List<String>usernameList){
-
//保存增加的联系人
-
Map<String,User>localUsers=WuerbaApplication.getInstance().getContactList();
-
Map<String,User>toAddUsers=newHashMap<String,User>();
-
for(Stringusername:usernameList){
-
Useruser=setUserHead(username);
-
//添加好友时可能会回调added方法两次
-
if(!localUsers.containsKey(username)){
-
userDao.saveContact(user);
-
}
-
toAddUsers.put(username,user);
-
}
-
localUsers.putAll(toAddUsers);
-
-
}
-
-
@Override
-
publicvoidonContactDeleted(finalList<String>usernameList){
-
//被删除
-
Map<String,User>localUsers=WuerbaApplication.getInstance().getContactList();
-
for(Stringusername:usernameList){
-
localUsers.remove(username);
-
userDao.deleteContact(username);
-
inviteMessgeDao.deleteMessage(username);
-
}
-
runOnUiThread(newRunnable(){
-
publicvoidrun(){
-
//如果正在与此用户的聊天页面
-
Stringst10=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
-
publicvoidonContactInvited(Stringusername,Stringreason){
-
-
//接到邀请的消息,如果不处理(同意或拒绝),掉线后,服务器会自动再发过来,所以客户端不需要重复提醒
-
List<InviteMessage>msgs=inviteMessgeDao.getMessagesList();
-
-
for(InviteMessageinviteMessage:msgs){
-
if(inviteMessage.getGroupId()==null&&inviteMessage.getFrom().equals(username)){
-
inviteMessgeDao.deleteMessage(username);
-
}
-
}
-
//自己封装的javabean
-
InviteMessagemsg=newInviteMessage();
-
msg.setFrom(username);
-
msg.setTime(System.currentTimeMillis());
-
msg.setReason(reason);
-
Log.d("onContactInvited",username+"请求加你为好友,reason:"+reason);
-
//设置相应status
-
msg.setStatus(InviteMesageStatus.BEINVITEED);
-
-
}
-
-
@Override
-
publicvoidonContactAgreed(Stringusername){
-
List<InviteMessage>msgs=inviteMessgeDao.getMessagesList();
-
for(InviteMessageinviteMessage:msgs){
-
if(inviteMessage.getFrom().equals(username)){
-
return;
-
}
-
}
-
//自己封装的javabean
-
InviteMessagemsg=newInviteMessage();
-
msg.setFrom(username);
-
msg.setTime(System.currentTimeMillis());
-
Log.d("",username+"同意了你的好友请求");
-
msg.setStatus(InviteMesageStatus.BEAGREED);
-
-
}
-
-
@Override
-
publicvoidonContactRefused(Stringusername){
-
-
//参考同意,被邀请实现此功能,demo未实现
-
Log.d(username,username+"拒绝了你的好友请求");
-
}
-
-
}
在onresume中设置事件监听
-
@Override
-
protectedvoidonResume(){
-
super.onResume();
-
if(!isConflict&&!isCurrentAccountRemoved){
-
updateUnreadLabel();
-
EMChatManager.getInstance().activityResumed();
-
}
-
-
//unregisterthiseventlistenerwhenthisactivityentersthe
-
//background
-
ChatHXSDKHelpersdkHelper=(ChatHXSDKHelper)ChatHXSDKHelper.getInstance();
-
sdkHelper.pushActivity(this);
-
-
//registertheeventlistenerwhenentertheforeground
-
EMChatManager.getInstance().registerEventListener(this,
-
newEMNotifierEvent.Event[]{EMNotifierEvent.Event.EventNewMessage,EMNotifierEvent.Event.EventOfflineMessage,EMNotifierEvent.Event.EventConversationListChanged});
-
}
在ui被打断时保存
-
@Override
-
protectedvoidonSaveInstanceState(BundleoutState){
-
outState.putBoolean("isConflict",isConflict);
-
outState.putBoolean(UIHelper.ACCOUNT_REMOVED,isCurrentAccountRemoved);
-
super.onSaveInstanceState(outState);
-
}
在ui销毁时设置注销监听
-
@Override
-
protectedvoidonDestroy(){
-
-
super.onDestroy();
-
-
if(connectionListener!=null){
-
EMChatManager.getInstance().removeConnectionListener(connectionListener);
-
}
-
}
-
@Override
-
protectedvoidonStop(){
-
EMChatManager.getInstance().unregisterEventListener(this);
-
ChatHXSDKHelpersdkHelper=(ChatHXSDKHelper)ChatHXSDKHelper.getInstance();
-
sdkHelper.popActivity(this);
-
-
super.onStop();
-
}
具体的聊天可参考环信的demo ,ps:直接拷贝她的聊天adapter到自己项目中进行修改最为简洁,否则容易漏掉某些地方而导致报错 |