拦截消息
IMKit 支持设置消息拦截器 MessageInterceptor
,可在消息发送前、发送后、接收时、插入本地数据库前进行拦截,方便您进行自定义处理。
消息拦截器说明
MessageInterceptor
是一个接口类,包含以下方法。
方法 | 说明 |
---|---|
interceptOnSendMessage | 拦截待发送的消息。该方法可拦截 Message 对象。 |
interceptOnSentMessage | 拦截发送成功的消息。该方法可拦截 Message 对象。 |
interceptOnInsertOutgoingMessage | interceptOnInsertOutgoingMessage 拦截待插入本地消息数据库的发送方向的消息的消息内容,提供两个重载方法:
|
interceptOnInsertIncomingMessage | 拦截待插入本地消息数据库的接收方向的消息的消息内容。 |
interceptReceivedMessage | 拦截接收的消息。SDK 连接后将先接收离线消息。 hasPackage 标识是否还有剩余的离线消息包,left 表示当前正在接收的离线消息包剩余多少条。hasPackage 为 false 且 left 为 0 表示离线消息已接收完毕,当前拦截的消息为实时消息。该方法可拦截 Message 对象。 |
在上述所有方法中返回 false
表示 App 仅需要拦截处理,处理完毕后由 SDK 完成后续流程。返回 true
表示 App 需要在拦截后自行处理后续流程,例如 App 希望在处理完毕后自行发送修改后的消息,可返回 true
。
设置消息拦截器
使用 IMCenter
的 setMessageInterceptor
设置消息拦截器。代码示例说明如下:
- 在
interceptOnSendMessage
方法中拦截并修改消息推送内容 - 在
interceptOnInsertOutgoingMessage
方法中拦截并修改图片和 GIF 消息扩展
Java
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;
}
});
}