技术原理
实现过程
准备工作
发送阅后即焚消息
// 阅后即焚标识(这里只是举例,你可以自定义具体字段)
private final String FIRE_FLAG = "fire";
// 创建文本消息,toChatUsername 为接收方用户 ID
EMMessage message = EMMessage.createTextSendMessage("这是一条阅后即焚消息", toChatUsername);
// 设置为单聊
message.setChatType(EMMessage.ChatType.Chat);
// 设置消息扩展字段传递阅后即焚标识
message.setAttribute(FIRE_FLAG, true);
// 发送消息
EMClient.getInstance().chatManager().sendMessage(message);接收和删除消息
// 阅后即焚标识(这里只是举例,你可以自定义具体字段)private final String FIRE_FLAG = "fire";// 注册消息监听器EMMessageListener msgListener = new EMMessageListener() {
@Override
public void onMessageReceived(List<EMMessage> messages) {
for (EMMessage message : messages) {
// 判断是否为阅后即焚消息
// 使用 getBooleanAttribute(key, defaultValue) 避免捕获 HyphenateException
if (message.getBooleanAttribute(FIRE_FLAG, false)) {
// 更新 UI,提示用户有一条阅后即焚消息
}
}
}
// 其他回调方法...
@Override
public void onCmdMessageReceived(List<EMMessage> messages) {}
@Override
public void onMessageRead(List<EMMessage> messages) {}
@Override
public void onMessageDelivered(List<EMMessage> messages) {}
@Override
public void onMessageRecalledWithExt(List<EMRecallMessageInfo> recallMessageInfo) {}
@Override
public void onMessageChanged(EMMessage message, Object change) {}};EMClient.getInstance().chatManager().addMessageListener(msgListener);// 当用户已读消息后(例如,点击查看了详情),发送已读回执并删除服务器和本地消息try {
// 发送已读回执
EMClient.getInstance().chatManager().ackMessageRead(message.getFrom(), message.getMsgId());
// 获取消息所属会话
EMConversation conversation = EMClient.getInstance().chatManager().getConversation(message.getFrom(), EMConversation.EMConversationType.Chat, true);
// 删除服务端和本地消息
ArrayList msgIds = new ArrayList<>();
msgIds.add(message.getMsgId());
conversation.removeMessagesFromServer(msgIds, new EMCallBack() {
@Override
public void onSuccess() {
//删除成功
// 刷新你的数据集,更新 UI
}
@Override
public void onError(int code, String error) {
//删除失败
//用户根据自己的业务需求进行处理
}
});} catch (HyphenateException e) {
e.printStackTrace();}发送方删除消息
// 注册消息监听器EMMessageListener msgListener = new EMMessageListener() {
@Override
// 收到已读回执的回调
public void onMessageRead(List<EMMessage> messages) {
for (EMMessage message : messages) {
// 判断是否为阅后即焚消息
if (message.getBooleanAttribute(FIRE_FLAG, false)) {
// 消息所属会话:会话 ID 为接收方的用户 ID
EMConversation conversation = EMClient.getInstance().chatManager().getConversation(message.getTo(), EMConversation.EMConversationType.Chat, true);
// 删除服务端和本地消息
ArrayList msgIds = new ArrayList<>();
msgIds.add(message.getMsgId());
conversation.removeMessagesFromServer(msgIds, new EMCallBack() {
@Override
public void onSuccess() {
//删除成功
// 刷新你的数据集,更新 UI
}
@Override
public void onError(int code, String error) {
//删除失败
//用户根据自己的业务需求进行处理
}
});
}
}
}
// 其他回调方法...
@Override
public void onMessageReceived(List<EMMessage> messages) {}
@Override
public void onCmdMessageReceived(List<EMMessage> messages) {}
@Override
public void onMessageDelivered(List<EMMessage> messages) {}
@Override
public void onMessageRecalledWithExt(List<EMRecallMessageInfo> recallMessageInfo) {}
@Override
public void onMessageChanged(EMMessage message, Object change) {}};EMClient.getInstance().chatManager().addMessageListener(msgListener);注意事项
// 在 Activity 中@Overrideprotected void onDestroy() {
// 移除消息监听器
if (msgListener != null) {
EMClient.getInstance().chatManager().removeMessageListener(msgListener);
}
super.onDestroy();}


