环信IM聊天<基于版本V3.22-V3.3>
1.通过扩展消息传递头像
EMClient.getInstance().chatManager().sendMessage(message);
//接收消息的时候获取到扩展属性
//获取自定义的属性,第2个参数为没有此定义的属性时返回的默认值
message.getStringAttribute("attribute1",null);
message.getBooleanAttribute("attribute2", false);
上面API就可以将扩展消息传递出去,收到消息后直接message.getStringAttribute()可以很方便的获取到扩展消息了
最好不要在DemoHelp调用上图的方法,我之前使用这个方法出现的问题:多存了一遍内存,消息会重复,但是不是一定会产生,需要条件(你app被杀死后,然后运行app,把app切换到后台,然后再进去消息里面你就会发现有重复消息了,只需要将app杀死,后面再进去就没了)
2.通过透传消息进行回撤
1.<接收>找到DemoHelp的onCmdMessageReceived()这个回调,调用下面的方法就行了,
if (action.equals("cmd_revoke")) {
try {
String msgid = message.getStringAttribute("msgid");
EMConversation conversation =EMClient.getInstance().chatManager().getConversation(message.getTo());
//--删除消息来表示撤回--
conversation.removeMessage(msgid);
refreshUI();
} catch (HyphenateException e) {
e.printStackTrace();
}
}
*注意:EMClient.getInstance().chatManager().getConversation(message.getTo());这个方法message.getTo()是群Id 群组撤回 message.getFrom()单聊撤回
2.<发送>发送透传消息撤销ChatFragment类
//撤回消息
private void msgRevocation(String msgId) {
EMMessage cmdMsg = EMMessage.createSendMessage(EMMessage.Type.CMD);
// 如果是群聊,设置chattype,默认是单聊
if (chatType == CHATTYPE_GROUP) {
cmdMsg.setChatType(EMMessage.ChatType.GroupChat);
}
String action = "cmd_revoke";
EMCmdMessageBody cmdBody = new EMCmdMessageBody(action);
// 设置消息body
cmdMsg.addBody(cmdBody);
// 设置要发给谁,用户username或者群聊groupid
cmdMsg.setTo(toChatUsername);
// 通过扩展字段添加要撤回消息的id
cmdMsg.setAttribute("msgid", msgId);
cmdMsg.setMessageStatusCallback(new EMCallBack() {
@Override
public void onSuccess() {
//撤销成功,删除本地改数据
conversation.removeMessage(contextMenuMessage.getMsgId());
messageList.refresh();
ToastUtils.showLongToastSafe("撤销消息成功");
}
@Override
public void onError(int i, String s) {
ToastUtils.showLongToastSafe("撤回失败");
}
@Override
public void onProgress(int i, String s) {
}
});
EMClient.getInstance().chatManager().sendMessage(cmdMsg);
}
3.Demo的视频录制在华为有的手机上会卡死
原因是因为Canvas不有释放