转发消息

大约 2 分钟

转发消息

转发消息即将会话中发送成功或收到的消息转发给别人,例如,用户 A 向用户 B 发送了一条消息,用户 B 收到后,将其转发给用户 C。

环信即时通讯 IM 支持用户转发单条或多条消息。

技术原理

环信即时通讯 IM Android SDK 通过 EMChatManager 类和 EMMessage 类实现消息的转发。

  • 转发单条消息:创建一条与原消息完全相同的消息,调用 EMChatManager#sendMessage 方法转发消息。
  • 转发多条消息:通过发送合并消息实现。

前提条件

开始前,请确保满足以下条件:

实现方法

转发单条消息

你可以调用 EMMessage#addBodyEMMessage#setAttribute 方法通过传入原消息的消息体和扩展字段(若原消息有的话),创建一条与原消息完全相同的消息,然后调用 EMChatManager#sendMessage 方法转发消息。

你可以在单聊、群组聊天、聊天室以及子区中转发所有类型的消息。对于附件类型的消息,转发时无需重新上传附件,不过,若消息过期(即由于超过了存储时间已从环信服务器上删除),转发后接收方可查看附件地址,但无法下载附件。

提示

该功能也支持转发单条合并消息。

// messageId 为要转发的消息 ID。
String messageId = "";
EMMessage targetMessage = EMClient.getInstance().chatManager().getMessage(messageId);
// to: 单聊为对端用户 ID,群聊为群组 ID,聊天室聊天为聊天室 ID。
String to = "the conversationId you want to send to";
EMMessage newMessage = EMMessage.createSendMessage(targetMessage.getType());
newMessage.setTo(to);
//聊天类型默认为单聊。对于群聊或者聊天室,需要将 chatType 设置为 EMMessage.ChatType.GroupChat 或 EMMessage.ChatType.ChatRoom。
//newMessage.setChatType(EMMessage.ChatType.GroupChat);

// 使用原消息的 body 和 ext 创建转发消息
EMMessageBody targetMessageBody = targetMessage.getBody();
newMessage.addBody(targetMessageBody);
Map<String, Object> ext = targetMessage.ext();
//遍历 ext
if (ext != null) {
    for (Map.Entry<String, Object> entry : ext.entrySet()) {
        Object value = entry.getValue();
        if (value instanceof Long) {
            newMessage.setAttribute(entry.getKey(), (long) value);
        } else if (value instanceof Integer) {
            newMessage.setAttribute(entry.getKey(), (int) value);
        } else if (value instanceof String) {
            newMessage.setAttribute(entry.getKey(), (String) value);
        } else if (value instanceof Boolean) {
            newMessage.setAttribute(entry.getKey(), (boolean) value);
        } else if (value instanceof Double) {
            newMessage.setAttribute(entry.getKey(), (double) value);
        } else if (value instanceof Float) {
            newMessage.setAttribute(entry.getKey(), (float) value);
        } else if (value instanceof JSONArray) {
            newMessage.setAttribute(entry.getKey(), (JSONArray) value);
        } else if (value instanceof JSONObject) {
            newMessage.setAttribute(entry.getKey(), (JSONObject) value);
        }
    }
}
EMClient.getInstance().chatManager().sendMessage(newMessage);

转发多条消息

对于转发多条消息,环信即时通讯 IM 支持将多个消息合并在一起进行转发,详见发送合并消息