技術原理
實現過程
準備工作
發送閱后即焚消息
// 閱后即焚標識(這里只是舉例,你可以自定義具體字段)
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();}


