跳到主要内容

修改消息

您通过 IMLib SDK 成功发送一条消息之后,可能发现消息内容有误,希望修改消息内容,同时在接收方的消息记录中同步更新。您可以使用消息修改功能实现该需求。

消息修改 API 支持所有存储类型消息(文本、图片(包含 GIF)、语音(高清、普通)、视频、引用、文件、自定义消息)。

使用场景

  • 私聊场景:用户消息发送成功后,可以对已发送的消息内容进行编辑。
  • 群聊场景:用户发送消息成功后,可以对已发送的消息内容进行编辑,或群组管理员可以编辑指定消息内容。
提示

从 5.26.0 版本开始支持消息修改功能。

消息修改监听

消息发送方修改消息后,消息接收方可以添加消息修改回调接口监听消息被修改的事件,并进行相应处理。

消息接收方需要使用 addMessageModifiedListener 添加一个监听器,用于监听已接收的消息被修改的事件。当接收到的某条消息被修改时,会通过此监听器回调。

接口

Java
RongCoreClient.getInstance().addMessageModifiedListener(listener);

其中 listener 参数为消息被修改监听器(IRongCoreListener.MessageModifiedListener),提供以下方法:

参数说明

返回值方法说明
voidonMessageModified(List<Message> messages)接收到的某条消息被修改时,会触发此回调。
voidonModifiedMessageSyncCompleted()离线的消息修改记录同步完成回调。

移除监听

为了避免内存泄露,请在不需要监听时调用 removeMessageModifiedListener 移除监听器。

Java
RongCoreClient.getInstance().removeMessageModifiedListener(listener);

修改消息

您可以通过调用 modifyMessageWithParams 接口修改已发送的消息。

接口

Java
RongCoreClient.getInstance().modifyMessageWithParams(params, callback);

参数说明

参数类型说明
paramsModifyMessageParams消息修改参数对象
callbackIRongCoreCallback.ModifyMessageCallback接口回调

ModifyMessageParams 属性说明

属性类型说明
messageUIdString消息唯一 ID。
messageContentMessageContent修改后的消息体。

IRongCoreCallback.ModifyMessageCallback 参数说明

调用接口修改消息,会通过 IRongCoreCallback.ModifyMessageCallbackonComplete 方法回调结果。

返回值方法说明
voidonComplete(errorCode, message)无论成功失败,均回调本接口。接口调用成功后,message 为修改后的消息;如果修改失败,message 为原始消息;如果 SDK 未初始化或接口参数校验不通过导致的失败,messageNULL

示例代码

Java
// 假设 originalMessage 是要修改的原消息
MessageContent content = originalMessage.getContent();
// 修改消息体
if (content instanceof TextMessage) {
((TextMessage) content).setContent("修改后的消息体");
}

ModifyMessageParams params = new ModifyMessageParams(originalMessage.getUId(), content);
RongCoreClient.getInstance().modifyMessageWithParams(params, new IRongCoreCallback.ModifyMessageCallback() {
@Override
public void onComplete(IRongCoreEnum.CoreErrorCode errorCode, Message message) {
// 处理结果
}
});

批量查询需要刷新的引用消息

由于引用消息 ReferenceMessage 缓存了原文本消息的内容,修改原文本消息不会主动更新引用消息中缓存的消息内容。在显示引用消息时,您可以通过调用 refreshReferenceMessageWithParams 接口刷新引用消息,将引用消息中缓存的文本内容刷新成最新的消息内容。

接口

Java
RongCoreClient.getInstance().refreshReferenceMessageWithParams(params, callback);

参数说明

参数类型说明
paramsRefreshReferenceMessageParams参数信息
callbackIRongCoreCallback.RefreshReferenceMessageCallback接口回调

RefreshReferenceMessageParams 属性说明

属性类型说明
conversationIdentifierConversationIdentifier会话标识。
messageUIdsList<String>引用消息唯一 ID 数组,最多 20 个。

IRongCoreCallback.RefreshReferenceMessageCallback 参数说明

调用批量查询需要刷新的引用消息接口,会通过 IRongCoreCallback.RefreshReferenceMessageCallback 回调结果。

返回值方法说明
voidonLocalMessageBlock(msgList)本地存在的消息回调。
voidonRemoteMessageBlock(msgList)本地不存在的消息,会自动加载远端消息,并回调结果。
voidonError(errorCode)失败回调。

MessageResult 属性说明

属性类型说明
messageUIdString查询的消息 UID。
messageMessage查到的消息。
codeIRongCoreEnum.CoreErrorCode错误码。

示例代码

Java
RefreshReferenceMessageParams params = new RefreshReferenceMessageParams(conversationIdentifier, messageUIds);

RongCoreClient.getInstance().refreshReferenceMessageWithParams(params, new IRongCoreCallback.RefreshReferenceMessageCallback() {
@Override
public void onLocalMessageBlock(List<MessageResult> msgList) {
for (MessageResult messageResult : msgList) {
if (messageResult.getCode() == IRongCoreEnum.CoreErrorCode.SUCCESS) {
Message message = messageResult.getMessage();
// 刷新 UI
// ......
}
}
}

@Override
public void onRemoteMessageBlock(List<MessageResult> msgList) {
for (MessageResult messageResult : msgList) {
if (messageResult.getCode() == IRongCoreEnum.CoreErrorCode.SUCCESS) {
Message message = messageResult.getMessage();
// 刷新 UI
// ......
}
}
}

@Override
public void onError(IRongCoreEnum.CoreErrorCode errorCode) {
// 错误处理
}
});