跳到主要内容

拦截消息

IMKit 支持设置消息拦截器 MessageInterceptor,可在消息发送前、发送后、接收时、插入本地数据库前进行拦截,方便应用程序进行自定义处理。

消息拦截器说明

MessageInterceptor 是一个接口类,包含以下方法。

方法说明
interceptOnSendMessage拦截待发送的消息。该方法可拦截 Message 对象。
interceptOnSentMessage拦截发送成功的消息。该方法可拦截 Message 对象。
interceptOnInsertOutgoingMessageinterceptOnInsertOutgoingMessage 拦截待插入本地消息数据库的发送方向的消息的消息内容,提供两个重载方法:
  • 支持 ResultCallback<Message> callback 的方法用于在图片消息、GIF 消息被插入本地数据库前进行拦截。详见下文如何拦截 IMKit 内置会话页面发送的图片和 GIF 消息。要求 SDK ≧ 5.2.4。
  • 不支持 callback 参数的方法用于拦截待插入本地消息数据库的发送方向的消息的消息内容。注意,不可用于拦截 IMKit 内置会话页面发送的图片消息和 GIF 消息。
interceptOnInsertIncomingMessage拦截待插入本地消息数据库的接收方向的消息的消息内容。
interceptReceivedMessage拦截接收的消息。SDK 连接后将先接收离线消息。 hasPackage 标识是否还有剩余的离线消息包,left 表示当前正在接收的离线消息包剩余多少条。hasPackagefalseleft 为 0 表示离线消息已接收完毕,当前拦截的消息为实时消息。该方法可拦截 Message 对象。

在上述所有方法中返回 false 表示 App 仅需要拦截处理,处理完毕后由 SDK 完成后续流程。返回 true 表示 App 需要在拦截后自行处理后续流程,例如 App 希望在处理完毕后自行发送修改后的消息,可返回 true

设置消息拦截器

使用 IMCentersetMessageInterceptor 设置消息拦截器。代码示例说明如下:

  • interceptOnSendMessage 方法中拦截并修改消息推送内容
  • interceptOnInsertOutgoingMessage 方法中拦截并修改图片和 GIF 消息扩展
private void initInterceptor() {
IMCenter.getInstance().setMessageInterceptor(
new MessageInterceptor() {
@Override
public boolean interceptReceivedMessage(
Message message,
int left,
boolean hasPackage,
boolean offline) {
return false;
}

@Override
public boolean interceptOnSendMessage(Message message) {
MessageContent messageContent = message.getContent();
String language = mContext.getResources().getConfiguration().locale.getLanguage();
if (language.endsWith("en")) { // 手机系统语言为英文
if (messageContent instanceof VoiceMessage) {
MessagePushConfig messagePushConfig = message.getMessagePushConfig();
if (messagePushConfig == null){
messagePushConfig = new MessagePushConfig();
message.setMessagePushConfig(messagePushConfig);
}
messagePushConfig.setPushContent("[voice]");// 语音消息时推送显示为 "\[voice\]"
}
}
return false;

}

@Override
public boolean interceptOnSentMessage(Message message) {
if (message != null) {
message.setMessageConfig(null);
}

return false;
}


@Override
public boolean interceptOnInsertOutgoingMessage(
Conversation.ConversationType type,
String targetId,
Message.SentStatus sentStatus,
MessageContent content,
long time) {
return false;
}


@Override
public boolean interceptOnInsertOutgoingMessage(Conversation.ConversationType type, String targetId, Message.SentStatus sentStatus,
MessageContent content, long time, RongIMClient.ResultCallback<Message> callback) {
//含 UI 集成设置图片消息可扩展时,此方法 return true,构建 message 将可扩展属性设置为 true,并调用 callback.onSuccess(message);
Message message=Message.obtain(targetId,type,content);
message.setCanIncludeExpansion(true);
callback.onSuccess(message);
return true;
}

@Override
public boolean interceptOnInsertIncomingMessage(
Conversation.ConversationType type,
String targetId,
String senderId,
Message.ReceivedStatus receivedStatus,
MessageContent content,
long time) {
return false;
}
});

}

如何拦截 IMKit 内置会话页面发送的图片和 GIF 消息

提示

要求 SDK 版本 ≧ 5.2.4。

使用 IMKit 内置会话页面发送图片和 GIF 消息时,SDK 会先在内部调用插入消息方法将消息插入本地消息数据库,再调用发送消息方法。如果应用程序有以下需求:

  • 对图片消息和 GIF 消息设置消息扩展,需要打开图片消息和 GIF 消息的可扩展属性(setCanIncludeExpansion(true))。
  • 修改图片消息和 GIF 消息的部分数据,例如缩略图、或者消息内容体内的 extra 字段等。
  • 彻底拦截图片消息和 GIF 消息,由应用程序自定义处理。

必须在消息插入本地数据库前拦截图片、GIF 消息,使用以下方法进行拦截:

default boolean interceptOnInsertOutgoingMessage(
Conversation.ConversationType type,
String targetId,
Message.SentStatus sentStatus,
MessageContent content,
long time,
RongIMClient.ResultCallback<Message> callback)

应用程序处理完毕后:

  • 如需 SDK 继续发送被拦截的消息,需要调用 callback.onSuccess(message) 表示交给 SDK 继续发送该消息,此时必须在 interceptOnInsertOutgoingMessage 方法中返回 true,否则会发出两条内容重复的消息。
  • 如需彻底拦截,则调用 callback.onError(IRongCoreEnum.CoreErrorCode.PARAMETER_ERROR),并在 interceptOnInsertOutgoingMessage 中返回 true