文档导航
Android
SDK 版本:  5.X
公告:融云新文档中心已上线,欢迎到新文档中心阅读 Android IMLibAndroid IMKit 的文档。

撤回消息

更新时间:2024-04-25 PDF

撤回消息

您的用户通过 App 成功发送了一条消息之后,可能发现消息内容错误等情况,希望将消息撤回,同时从接收者的消息记录中移除该消息。您可以使用撤回消息功能实现该需求。

recallMessage 会替换聊天记录中的原始消息为一条 objectName 为 RC:RcNtf 的撤回通知消息(RecallNotificationMessage)。同时消息接收方可通过 OnRecallMessageListener 监听器获取服务端通知,在收到对方已撤回通知时进行相应操作并刷新界面。

撤回通知消息的结构说明可参见服务端文档通知类消息格式

默认情况下,融云对撤回消息的操作者不作限制。如需限制,可考虑以下方案:

  • App 客户端自行限制撤回消息的操作者。例如,不允许 App 业务中的普通用户撤回他人发送的消息,允许 App 业务中的管理员角色撤回他人发送的消息。
  • 如需避免用户撤回非本人发送的消息,可以提交工单申请打开IMLib SDK 只允许撤回自己发送的消息。从融云服务端进行限制,禁止用户撤回非本人发送的消息。

IMLib 对于撤回消息并没有做时间限制,现在主流的社交软件都会进行撤回时间限制,建议开发者自行做撤回时间限制。

撤回消息

撤回指定消息,只有已发送成功的消息可被撤回。撤回的结果通过 callback 回调。onSuccess 中会返回替换后撤回提示小灰条消息(RecallNotificationMessage),您可以根据需要在界面展示。

RongIMClient.getInstance().recallMessage(message, pushContent, callback);
              
已复制
1

参数 类型 说明
message Message 待撤回的消息对象
pushContent String Push 消息时,在通知栏里会显示这个字段。 如果发送的是自定义消息,该字段必须填写,否则无法收到 push 消息。sdk 中默认的消息类型,例如 RC:TxtMsg, RC:VcMsg, RC:ImgMsg,则不需要填写,默认已经指定
callback IRongCallback.ResultCallback<RecallNotificationMessage> 接口回调
Message message = Message.obtain("123", ConversationType.GROUP, "12345");

RongIMClient.getInstance().recallMessage(message, " ", new RongIMClient.ResultCallback<RecallNotificationMessage>() {
    /**
     * 成功回调
     */
    @Override
    public void onSuccess(RecallNotificationMessage recallNotificationMessage) {

    }

    /**
     * 失败回调
     * @param errorCode 错误码
     */
    @Override
    public void onError(RongIMClient.ErrorCode errorCode) {

    }
});
              
已复制
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

如果需要通过消息 ID (数据库索引唯一值)或者 UID(服务器消息唯一 ID)撤回消息,可先通过以下方法获取待撤回的消息,再使用 recallMessage 撤回消息。

    /**
     * 根据消息 id 获取消息体(数据库索引唯一值)。
     *
     * @param messageId 消息 id。
     * @param callback 回调。
     */
    public abstract void getMessage(final int messageId, final ResultCallback<Message> callback);

    /**
     * 通过全局唯一 id 获取消息实体。
     *
     * @param uid 全局唯一 id(服务器消息唯一 id)。
     * @param callback 获取消息的回调。
     */
    public abstract void getMessageByUid(final String uid, final ResultCallback<Message> callback);
              
已复制
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

撤回消息时携带用户信息(userInfo)和附加信息(extra)

某些情况下,您可能希望在撤回消息的同时附加一些用户信息和其他的一些额外信息。 为了实现这个功能,您可以在调用撤回消息的 API 时,为消息内容中的 senderUserInfoextra 字段设置相应的值。以下是如何在 Java 代码中实现上述功能的示例:

// 获取消息实例。
RongIMClient.getInstance().getMessage(messageId, new ResultCallback<Message>() {
            @Override
            public void onSuccess(Message message) {
                // 设置用户信息和额外信息。
                message.getContent().setUserInfo(new UserInfo("id", "name", null));
                message.getContent().setExtra("the user's extra information");
                // 执行撤回操作。
                RongIMClient.getInstance().recallMessage(message, "", new ResultCallback<RecallNotificationMessage>() {
                    @Override
                    public void onSuccess(RecallNotificationMessage recallNotificationMessage) {

                    }

                    @Override
                    public void onError(ErrorCode e) {
                        // 撤回成功处理逻辑。
                    }
                });
            }

            @Override
            public void onError(ErrorCode e) {
                // 撤回失败处理逻辑。
            }
        });
              
已复制
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

撤回操作完成后,消息的 senderUserInfoextra 字段将更新为撤回时所附带的信息。

监听消息被撤回事件

消息发送方调用 recallMessage 后,消息接收方可通过 OnRecallMessageListener 监听消息被撤回的事件,并进行相应处理。

消息接收方需要使用 setOnRecallMessageListener 设置一个监听器, 用于监听已接收的消息被撤回的事件。当接收到的某条消息被撤回时,会通过此监听器回调。

RongIMClient.setOnRecallMessageListener(listener);
              
已复制
1

其中 listener 参数为消息被撤回监听器(OnRecallMessageListener),提供一个 onMessageRecalled 方法,如下:

返回值 方法
boolean onMessageRecalled(Message message, RecallNotificationMessage recallNotificationMessage) 接收到的某条消息被撤回时,会触发此回调。
文档反馈
意见反馈

您的改进建议

意见反馈

问题类型

联系我们

提交工单

技术支持|集成使用|产品方案


商务咨询

7 x 24 小时

为您解答方案与报价问题

131 6185 6839

文档反馈