Message Recall
After successfully sending a message through the IMLib SDK, you may discover content errors and wish to recall the message while removing it from the recipient's message history. The message recall feature fulfills this requirement.
The recallMessage interface replaces the original message in the chat history with a recall notification message (objectName: RC:RcNtf) ([RecallNotificationMessage]). Simultaneously, message recipients can receive server notifications through the OnRecallMessageListener callback, allowing them to perform corresponding actions and refresh the UI upon receiving recall notifications.
For details about the structure of recall notification messages, refer to the server-side documentation Notification Message Format.
By default, RC places no restrictions on who can recall messages. To implement restrictions, consider these approaches:
- The App client can enforce restrictions on message recall operations. For example, regular users may be prohibited from recalling messages sent by others, while administrator roles may be permitted to do so.
- To prevent users from recalling messages not sent by themselves, you can [submit a ticket] to enable the IMLib SDK Only Allows Recalling Self-Sent Messages feature. This restriction is enforced at the RC server level, preventing users from recalling others' messages.
IMLib imposes no time limit for message recall. Since most social apps implement recall time limits, we recommend developers set their own time restrictions.
Listening for Message Recall Events
When the sender calls recallMessage, recipients can monitor recall events through OnRecallMessageListener and handle them accordingly.
Recipients must use setOnRecallMessageListener to register a callback for monitoring received message recalls. This listener triggers when any received message gets recalled.
Interface
RongIMClient.setOnRecallMessageListener(listener);
The listener parameter is the message recall listener (OnRecallMessageListener), which provides an onMessageRecalled method as follows:
Parameter Description
| Return Value | Method | |
|---|---|---|
| boolean | onMessageRecalled(Message message, RecallNotificationMessage recallNotificationMessage) | Triggers when a received message is recalled. |
Recalling Messages
Configuration support added in version 5.16.1.
You can customize recall behavior by creating a RecallMessageOption object. Only successfully sent messages can be recalled. The recall result is returned via the callback.
Interface
RongCoreClient.getInstance().recallMessage(message, recallMessageOption, pushContent, callback);
Parameter Description
| Parameter | Type | Description |
|---|---|---|
| message | Message | The message object to be recalled |
| recallMessageOption | RecallMessageOption | Configuration options for message recall |
| pushContent | String | Push notification content displayed in the notification bar. Required for custom messages; default message types (e.g., RC:TxtMsg, RC:VcMsg, RC:ImgMsg) have predefined values. |
| callback | IRongCallback.ResultCallback<Message> | Callback interface |
Example Code
Message message = Message.obtain("123", ConversationType.GROUP, "12345");
// Whether to delete the recalled message
boolean isDelete=true;
// Whether the user is an administrator
boolean isAdmin=false;
// Whether to disable notifications
boolean disableNotification=false;
RecallMessageOption recallMessageOption = new RecallMessageOption(isDelete, isAdmin, disableNotification);
RongCoreClient.getInstance().recallMessage(message, recallMessageOption, "", new IRongCoreCallback.ResultCallback<Message>() {
@Override
public void onSuccess(Message message) {
}
@Override
public void onError(IRongCoreEnum.CoreErrorCode e) {
}
});
Message Recall (Deprecated)
Recall a specific message (only successfully sent messages can be recalled). The recall result is returned via the callback. The onSuccess callback returns the replacement gray-bar recall notification message (RecallNotificationMessage), which can be displayed in the UI as needed.
Interface
RongIMClient.getInstance().recallMessage(message, pushContent, callback);
Parameter Description
| Parameter | Type | Description |
|---|---|---|
| message | Message | The message object to be recalled |
| pushContent | String | Push notification content displayed in the notification bar. Required for custom messages; default message types (e.g., RC:TxtMsg, RC:VcMsg, RC:ImgMsg) have predefined values. |
| callback | IRongCallback.ResultCallback<RecallNotificationMessage> | Callback interface |
Example Code
Message message = Message.obtain("123", ConversationType.GROUP, "12345");
RongIMClient.getInstance().recallMessage(message, " ", new RongIMClient.ResultCallback<RecallNotificationMessage>() {
/**
* Success callback
*/
@Override
public void onSuccess(RecallNotificationMessage recallNotificationMessage) {
}
/**
* Failure callback
* @param errorCode Error code
*/
@Override
public void onError(RongIMClient.ErrorCode errorCode) {
}
});
To recall a message using either messageId (local database unique index value) or messageUId (server message unique ID), you can first retrieve the target message using the `getMessage` methods below, then use `recallMessage` to recall it.
```java
/**
* Get message object by message id (database unique index value).
*
* @param messageId Message ID.
* @param callback Callback.
*/
public abstract void getMessage(final int messageId, final ResultCallback<Message> callback);
/**
* Get message object by globally unique ID.
*
* @param uid Globally unique ID (server message unique ID).
* @param callback Message retrieval callback.
*/
public abstract void getMessageByUid(final String uid, final ResultCallback<Message> callback);
<!--api links -->
[RecallNotificationMessage]: https://doc.rongcloud.cn/apidoc/imlibcore-android/latest/zh_CN/html/-android--i-m-lib-core--s-d-k/io.rong.message/-recall-notification-message/
[Submit ticket]: https://console.rongcloud.io/agile/formwork/ticket/create