Android

圈组消息删除

更新时间: 2024/11/21 17:47:20

NIM SDK 的QChatMessageService接口提供方法支持在发送消息后删除消息。

消息发送方和拥有删除他人消息权限(DELETE_MSG)的频道成员都可删除消息。

前提条件

实现流程

API 调用时序

以下时序图可能因为网络问题而显示异常。如显示异常,一般刷新当前页面即可正常显示。

sequenceDiagram

note over NIM SDK: 初始化 SDK 并登录 IM
par  注册监听并登录圈组 
发送方  ->> NIM SDK: 注册消息更新回调
发送方 ->> NIM SDK: 登录圈组
接收方  ->> NIM SDK: 注册接收消息回调
接收方  ->> NIM SDK: 注册消息更新回调
接收方 ->> NIM SDK: 登录圈组
end
note over NIM SDK: 双方加入同一服务器且<br>能访问同一频道
note over NIM SDK: 发送方拥有发送消息的权限<br>接收方拥有删除他人消息的权限  
par  消息收发 
发送方 ->> NIM SDK: 在频道发送消息
NIM SDK --> 接收方: 投递消息(QChatMessage)
接收方  ->> NIM SDK: 删除消息
NIM SDK -->> 接收方: 消息删除结果
NIM SDK -->> 发送方: 消息删除结果
end

具体流程

本节仅对上图中标为部分的流程进行说明,其他流程请参考相关文档。例如:


  1. 注册回调函数并登录。

    • 发送方在登录圈组前,注册observeMessageDelete消息删除观察者,监听消息删除。
    • 接收方在登录圈组前,注册observeReceiveMessage消息接收观察者和observeMessageDelete消息删除观察者,分别监听消息接收和消息删除。

    示例代码如下:

    注册消息接收观察者
    NIMClient.getService(QChatServiceObserver.class).observeReceiveMessage(new Observer<List<QChatMessage>>() {
        @Override
        public void onEvent(List<QChatMessage> qChatMessages) {
            //收到消息qChatMessages
            for (QChatMessage qChatMessage : qChatMessages) {
                //处理消息
            }
        }
    }, true);
    
    注册消息删除观察者
    NIMClient.getService(QChatServiceObserver.class).observeMessageDelete(new Observer<QChatMessageDeleteEvent>() {
        @Override
        public void onEvent(QChatMessageDeleteEvent event) {
            //收到删除后的消息qChatMessage
            QChatMessage message = event.getMessage();
    
        }
    }, true);
    
  2. 接收方在收到消息后,调用deleteMessage方法删除消息。

    该方法入参结构QChatDeleteMessageParam 必须传入更新操作通用参数、消息所属的服务器的 ID、消息所属的频道的 ID、消息发送时间以及消息服务端 ID。

    删除未读消息将影响未读数。


    示例代码如下:

    QChatUpdateParam updateParam = new QChatUpdateParam();
    updateParam.setPostscript("附言");
    updateParam.setExtension("操作扩展字段");
    NIMClient.getService(QChatMessageService.class).deleteMessage(new QChatDeleteMessageParam(updateParam,943445L,885305L,currentMessage.getTime(),currentMessage.getMsgIdServer()))
            .setCallback(new RequestCallback<QChatDeleteMessageResult>() {
                @Override
                public void onSuccess(QChatDeleteMessageResult result) {
                    //删除成功,返回删除后的消息
                    QChatMessage message = result.getMessage();
                }
    
                @Override
                public void onFailed(int code) {
                    //删除失败,返回错误code
                }
    
                @Override
                public void onException(Throwable exception) {
                    //删除异常
                }
            });
    
    
  3. observeMessageDelete观察者回调函数触发,将消息删除结果投递至接收方和发送方。

相关信息

圈组各端 (Android、iOS、Windows 和 含圈组版 Web)监听消息更新、消息撤回和消息删除的方式略有差异,具体为:Android 将消息更新、消息撤回和消息删除三个事件进行区分;而其他端的消息撤回和消息删除事件,都并入消息更新事件,不进行区分。

各端的相关事件回调接口如下:

Android iOS Windows 含圈组版 Web
监听消息更新 observeMessageUpdate onMessageUpdate: RegUpdatedCb messageUpdate
监听消息撤回 observeMessageRevoke
监听消息删除 observeMessageDelete
此文档是否对你有帮助?
有帮助
去反馈
  • 前提条件
  • 实现流程
  • API 调用时序
  • 具体流程
  • 相关信息