注册

环信Android消息回撤

环信现在的消息回撤开发文档没有更新, 所以得自己去写, 本人贡献点小东西.本项目用的SDK版本为3.3.1.
1. 首先在聊天消息里添加消息长按事件监听,里面添加撤回消息选项. 
   撤回点击之后处理为:  发送撤回消息!!!!!!
cmdMsg = EMMessage.createSendMessage(EMMessage.Type.CMD);
// 如果是群聊, 设置chatType, 默认是单聊
if(chatType == Constant.CHATTYPE_GROUP){
cmdMsg.setChatType(ChatType.GroupChat);
}
String action = "REVOKE_FLAG";
EMCmdMessageBody cmdBody=new EMCmdMessageBody(action);
// 设置消息body
cmdMsg.addBody(cmdBody);
// 设置要发给谁, 用户username 或者群聊 grouid
cmdMsg.setTo(toChatUsername);
// 通过扩展字段添加要撤回消息的iD
cmdMsg.setAttribute("msgId", msgid); // 长按的时候, 获取本信息的message的Id
// long aa = cmdMsg.getMsgTime(); // 获取这个消息的发送时间
// 获取当前系统的时间
long time = new Date().getTime();
long minite = (time - aa - 6000)/1000; // 1s = 1000
if(minite <= 120){
EMClient.getInstance().chatManager().sendMessage(cmdMsg);
cmdMsg.setMessageStatusCallback(new EMCallBack() {

@Override
public void onSuccess() {
conversation.removeMessage(msgid);
handler.sendEmptyMessage(1);
}

@Override
public void onProgress(int arg0, String arg1) {
}

@Override
public void onError(int arg0, String arg1) {
// TODO Auto-generated method stub
String a = "";
// conversation.removeMessage(msgid);
}
});

}else{
ToastUtils.ToastShortMessage(getActivity(), "发送时间超过2分钟的消息!不能被撤回!");
}
break;





此处handler.sendEmptyMessage(1);中的内容是:         
ToastUtils.ToastShortMessage(getActivity(), "消息已撤回!");
messageList.refresh();





2. 环信在获取CMD消息监听有三个地方: 分别为, EaseChatFragment, MainActivity, DemoHelper(此处为App后台运行时, 消息撤回的处理)
在EMMessageListener下的onCmdMessageReceived()中处理接受到的CMD消息, 首先贴上的为EaseChatFragment里面的: 
for(EMMessage emMessage : messages){
EMCmdMessageBody cmdMessageBody = (EMCmdMessageBody)emMessage.getBody();
String action = cmdMessageBody.action();
if(action.equals("REVOKE_FLAG")){
try {
msgId = emMessage.getStringAttribute("msgId");
conversation1 = EMClient.getInstance().chatManager().getConversation(emMessage.getFrom());
if(emMessage.getChatType() == ChatType.GroupChat){
messageList.refreshSelectLast(); //刷新UI
}else{
handler.sendEmptyMessage(1);
}
} catch (HyphenateException e) {
e.printStackTrace();

}

}
}
此处handler.sendEmptyMessage(1)中的内容是:
// 删除表示撤销
conversation1.removeMessage(msgId);
messageList.refreshSelectLast();





3. MainActivity里面的处理方式:
    for(EMMessage emMessage : messages){
EMCmdMessageBody cmdMessageBody = (EMCmdMessageBody)emMessage.getBody();
String action = cmdMessageBody.action();
if(action.equals("REVOKE_FLAG")){
try {
msgId = emMessage.getStringAttribute("msgId");
conversation1 = EMClient.getInstance().chatManager().getConversation(emMessage.getFrom());
if(emMessage.getChatType() == ChatType.GroupChat){
refreshUIWithMessage(); // 刷新UI
}else{
handler.sendEmptyMessage(1);
}

} catch (HyphenateException e) {
e.printStackTrace();

}

}
}
 
此时handler.sendEmperymessage(1)中: 
conversation1.removeMessage(msgId);
refreshUIWithMessage();
4. DemoHelper里面的处理方式:
for (final EMMessage message : messages) {
// 获取消息body
EMCmdMessageBody cmdMsgBody = (EMCmdMessageBody) message.getBody();
final String action = cmdMsgBody.action();// 获取自定义action
// 发送一个透传消息
if(action.equals("REVOKE_FLAG")){
try {
if(message.getChatType() == ChatType.GroupChat){ // 群组处理方式
conversation1 = EMClient.getInstance().chatManager().getConversation(message.getTo(), EaseCommonUtils.getConversationType(2), true);
}else{
conversation1 = EMClient.getInstance().chatManager().getConversation(message.getFrom());
}
msgId = message.getStringAttribute("msgId");

handler.sendEmptyMessage(1);
} catch (HyphenateException e) {
e.printStackTrace();
}
}
}
此时handler.sendEmpertyMessage(1)中的方法是: 
conversation1.removeMessage(msgId);
至此,环信消息回调完成, 没有去做撤回回调处理,直接删除不好,如果想做的请自行处理.谢谢,本文纯属原创,如果有问题,可与我联系,QQ邮箱: 277667430@qq.com.本人姓氏: 侯

0 个评论

要回复文章请先登录注册