全部文档

更新时间: 2020-11-12

# 发送普通消息

Message 构造参数

参数 类型 必填 说明 最低版本
targetId String 接收方的 userId
conversationType ConversationType (opens new window) 会话类型. 当前为 ConversationType.PRIVATE
messageContent MessageContent (opens new window) 消息类型对象

发送参数

参数 类型 必填 说明
message Message (opens new window) 要发送的消息体
pushContent String 1. Push 消息时,在通知栏里会显示这个字段.
2. 自定义消息,该字段必须填写,否则无法收到 push 消息.
3. SDK 中默认的消息类型(如 RC:TxtMsg, RC:VcMsg, RC:ImgMsg) 默认已经指定, 可设置为 null
pushData String Push 附加信息。设置该字段,可在收到 push 消息时,通过 PushNotificationMessage#getPushData()} 方法获取 PushData
# 文本消息

消息说明

消息类名 父类名称 ObjectName 存储属性 计数属性 离线属性 推送属性 推送内容
TextMessage MessageContent (opens new window) RC:TxtMsg 存储 计数 存储 推送 消息内容

参数说明

参数 类型 必填 说明
content String 文本消息内容

示例代码

String content = “消息内容”;

ConversationType conversationType = ConversationType.PRIVATE;
String targetId = "接收方的 userId";

TextMessage messageContent = TextMessage.obtain(content);
Message message = Message.obtain(targetId, conversationType, messageContent);
RongIMClient.getInstance().sendMessage(message, null, null, new IRongCallback.ISendMessageCallback() {
        /**
         * 消息发送前回调, 回调时消息已存储数据库
         * @param message 已存库的消息体
         */
        @Override
        public void onAttached(Message message) {
            
        }
        /**
         * 消息发送成功。
         * @param message 发送成功后的消息体
         */
        @Override
        public void onSuccess(Message message) {

        }

        /**
         * 消息发送失败
         * @param message   发送失败的消息体
         * @param errorCode 具体的错误
         */
        @Override
        public void onError(Message message, RongIMClient.ErrorCode errorCode) {

        }
    });              

已复制
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# Emoji 消息

Android 端发送 Emoji 消息,开发者直接使用 文本消息 发送 Emoji 编码即可.

# 位置消息

消息说明

消息类名 父类 ObjectName 存储属性 计数属性 离线属性 推送属性 推送内容
LocationMessage (opens new window) MessageContent (opens new window) RC:LBSMsg 存储 计数 存储 推送 [位置]

参数说明

参数 类型 必填 说明
lat double 纬度
lng double 经度
poi String 位置信息
imgUri Uri 地图缩率图的地址.
1. 缩率图本地地址需以 file:// 开头.
2. 缩率图在 SDK 内部最终会以 Base64 的形式传输

示例代码

double lat = 40.0317727;
double lng = 116.4175057;
String poi = "北辰·泰岳";
String path = "缩略图的地址路径";

ConversationType conversationType = ConversationType.PRIVATE;
String targetId = "接收方的 userId";

LocationMessage locationMessage = LocationMessage.obtain(lat, lng, poi, Uri.parse(path));
Message message = Message.obtain(targetId, conversationType, messageContent);
RongIMClient.getInstance().sendLocationMessage(message, null ,null,new IRongCallback.ISendMessageCallback() {
       /**
         * 消息发送前回调, 回调时消息已存储数据库
         * @param message 已存库的消息体
         */
        @Override
        public void onAttached(Message message) {
            
        }
        /**
         * 消息发送成功。
         * @param message 发送成功后的消息体
         */
        @Override
        public void onSuccess(Message message) {

        }

        /**
         * 消息发送失败
         * @param message   发送失败的消息体
         * @param errorCode 具体的错误
         */
        @Override
        public void onError(Message message, RongIMClient.ErrorCode errorCode) {

        }
    });              

已复制
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# 正在输入状态消息

消息说明

消息类名 父类 ObjectName 存储属性 计数属性 离线属性 推送属性 推送内容
TypingStatusMessage (opens new window) MessageContent (opens new window) RC:TypSts 不存储 不计数 不存储 不推送

参数说明

参数 类型 必填 说明
conversationType ConversationType (opens new window) 会话类型. 当前为 ConversationType.PRIVATE
targetId String 接收方的 userId
typingContentType String typingContentType 为当前正在编辑的消息类型名,即 Message 中getObjectName 的返回值。
如文本消息,应该传类型名 "RC:TxtMsg"

示例代码

String targetId = "接收方的 userId";
ConversationType conversationType = ConversationType.PRIVATE;
String typingContentType = "RC:TxtMsg";

RongIMClient.getInstance().sendTypingStatus(conversationType) ,targetId, typingContentType);
已复制
1
2
3
4
5

# 发送媒体消息

Message 构造参数

参数 类型 必填 说明 最低版本
targetId String 接收方的 userId
conversationType ConversationType (opens new window) 会话类型. 当前为 ConversationType.PRIVATE
messageContent MessageContent (opens new window) 消息类型对象

发送参数

参数 类型 必填 说明
message Message (opens new window) 要发送的消息体
pushContent String 1. Push 消息时,在通知栏里会显示这个字段.
2. 自定义消息,该字段必须填写,否则无法收到 push 消息.
3. SDK 中默认的消息类型(如 RC:TxtMsg, RC:VcMsg, RC:ImgMsg) 默认已经指定, 可设置为 null
pushData String Push 附加信息。设置该字段,可在收到 push 消息时,通过 PushNotificationMessage#getPushData()} 方法获取 PushData
# 图片消息

消息说明

消息类名 父类名称 ObjectName 存储属性 计数属性 离线属性 推送属性 推送内容
ImageMessage (opens new window) MediaMessageContent RC:ImgMsg 存储 计数 存储 推送 [图片]

参数说明

参数 类型 必填 说明 最低版本
localUri Uri 图片的 Uri.
1. 仅支持 本地图片
2. 图片地址需以 file:// 开头, 不是以 file:// 开头的需拼接
3. 建议使用 jpg 格式图片, 大小不超过 80 KB
  1. 不设置缩率图, SDK 内部会自动生成缩率图. 缩率图会以 Base64 的形式传给接收方.
  2. 原图如果超过限制, 会进行压缩. 然后上传服务器.

示例代码

// 1. 仅支持本地图片
// 2. 图片地址需以 `file://` 开头, 不是以 `file://` 开头的需拼接
String path = "file://图片的路径";
Uri localUri = Uri.parse(path);

ConversationType conversationType = ConversationType.PRIVATE;
String targetId = "接收方的 userId";
ImageMessage imageMessage = ImageMessage.obtain(null, localUri);
RongIMClient.getInstance().sendImageMessage(conversationType, targetId, imageMessage, null,
                null, new RongIMClient.SendImageMessageCallback() {
        /**
         * 消息发送前回调, 回调时消息已存储数据库
         * @param message 已存库的消息体
         */
        @Override
        public void onAttached(Message message) {
            
        }
        /**
         * 消息发送成功
         * @param message 发送成功后的消息体
         */
        @Override
        public void onSuccess(Message message) {

        }

        /**
         * 消息发送失败
         * @param message   发送失败的消息体
         * @param errorCode 具体的错误
         */
        @Override
        public void onError(Message message, RongIMClient.ErrorCode errorCode) {

        }

        /**
         * 上传进度
         * @param message  发送的消息实体
         * @param progress 进度值: 0 - 100
         */
        @Override
        public void onProgress(Message message, int progress) {
            
        }
    });
已复制
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# 语音消息

2.9.24 版本及以上版本开始支持 HQVoiceMessage 消息类型, 高质量语音消息 HQVoiceMessage 和旧版本语音消息 VoiceMessage 不同的是将录制的音频数据存储到服务端,而消息体内只保存 URL。摆脱了消息体 128K 的大小限制,所以拥有更高音质。

切换语音消息 通过以下接口可以设置发送高质量语音消息还是普通的语音消息,默认为普通语音消息。

/*
**
* 设置语音消息类型,必须在 connect()之前调用
* @param voiceMessageType  消息类型{@link VoiceMessageType}
*/
public void setVoiceMessageType(VoiceMessageType voiceMessageType) {
    this.voiceMessageType = voiceMessageType;
}
已复制
1
2
3
4
5
6
7
8

收到高质量语音消息后是否自动下载 通过 rc_config 配置文件设置以下内容可以控制用户在线时,收到高质量语音消息后是否自动下载,默认为自动下载,设置为 false 时,只有在打开会话界面情况下才自动下载当前会话的语音消息文件。

<!--在线时是否自动下载高质量语音消息-->
<bool name="rc_enable_automatic_download_voice_msg">true</bool>
已复制
1
2

消息说明

消息类名 父类 ObjectName 存储属性 计数属性 离线属性 推送属性 推送内容
HQVoiceMessage MessageMediaContent RC:HQVCMsg 存储 计数 存储 推送 [语音]

参数说明

参数 类型 必填 说明 最低版本
audioUri Uri 音频文件的 Uri
1. 仅支持 本地音频文件
2. 本地音频地址需以 file:// 开头, 不是以 file:// 开头的需拼接
duration int 音频片段时长, 单位: . 最大为 60

示例代码

// 1. 仅支持本地音频
// 2. 本地音频地址需以 `file://` 开头, 不是以 `file://` 开头的需拼接
String path = "file://音频的路径";
Uri audioUri = Uri.parse(path);
int duration = "30";

ConversationType conversationType = ConversationType.PRIVATE;
String targetId = "接收方的 userId";

HQVoiceMessage messageContent = HQVoiceMessage.obtain(audioUri, duration);
Message message = Message.obtain(targetId, conversationType, messageContent)
RongIMClient.getInstance().sendMediaMessage(message, null, null, new IRongCallback.ISendMessageCallback() {
        /**
         * 消息发送前回调, 回调时消息已存储数据库
         * @param message 已存库的消息体
         */
        @Override
        public void onAttached(Message message) {
            
        }
        /**
         * 消息发送成功
         * @param message 发送成功后的消息体
         */
        @Override
        public void onSuccess(Message message) {

        }

        /**
         * 消息发送失败
         * @param message   发送失败的消息体
         * @param errorCode 具体的错误
         */
        @Override
        public void onError(Message message, RongIMClient.ErrorCode errorCode) {

        }

        /**
         * 上传进度
         * @param message  发送的消息实体
         * @param progress 进度值: 0 - 100
         */
        @Override
        public void onProgress(Message message, int progress) {
            
        }

        /**
         * 取消发送
         * @param message  发送的消息实体
         */
        @Override
        public void onCanceled(Message message) {
           
        }
});
已复制
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# 文件消息

消息说明

消息类名 父类 ObjectName 存储属性 计数属性 离线属性 推送属性 推送内容
FileMessage MediaMessageContent RC:FileMsg 存储 计数 存储 推送 [文件]

参数说明

参数 类型 必填 说明
uri Uri 文件地址的 Uri
1. 仅支持 本地文件
2. 本地文件地址需以 file:// 开头, 不是以 file:// 开头的需拼接

示例代码

// 1. 仅支持本地文件
// 2. 本地文件地址需以 `file://` 开头, 不是以 `file://` 开头的需拼接
String path = "file:// 文件地址";
Uri uri = Uri.parse(path);

ConversationType conversationType = ConversationType.PRIVATE;
String targetId = "接收方的 userId";

FileMessage messageContent = FileMessage.obtain(uri);
Message message = Message.obtain(targetId, conversationType, messageContent);
RongIMClient.getInstance().sendMediaMessage(message, null, null, new IRongCallback.ISendMediaMessageCallback(){
   /**
         * 消息发送前回调, 回调时消息已存储数据库
         * @param message 已存库的消息体
         */
        @Override
        public void onAttached(Message message) {
            
        }
        /**
         * 消息发送成功
         * @param message 发送成功后的消息体
         */
        @Override
        public void onSuccess(Message message) {

        }

        /**
         * 消息发送失败
         * @param message   发送失败的消息体
         * @param errorCode 具体的错误
         */
        @Override
        public void onError(Message message, RongIMClient.ErrorCode errorCode) {

        }

        /**
         * 上传进度
         * @param message  发送的消息实体
         * @param progress 进度值: 0 - 100
         */
        @Override
        public void onProgress(Message message, int progress) {
            
        }

        /**
         * 取消发送
         * @param message  发送的消息实体
         */
        @Override
        public void onCanceled(Message message) {
           
        }
});
                    
已复制
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# 小视频消息

使用小视频功能需要到融云开发者后台 (opens new window)服务管理-> 小视频-> 服务设置 中开通小视频功能。

消息说明

消息类名 父类 ObjectName 存储属性 计数属性 离线属性 推送属性 推送内容
SightMessage MediaMessageContent RC:SightMsg 存储 计数 存储 推送 [小视频]

参数说明

参数 类型 必填 说明
mediaUri Uri 本地视频文件的 Uri,小视频文件格式为 MP4
1. 仅支持 本地视频文件
2. 本地视频文件地址需以 file:// 开头, 不是以 file:// 开头的需拼接
duration int 视频时长,单位为

示例代码

// 1. 仅支持本地视频
// 2. 本地视频地址需以 `file://` 开头, 不是以 `file://` 开头的需拼接
String path = "file://本地视频";
Uri mediaUri = Uri.parse(path);
int duration = "30";

ConversationType conversationType = ConversationType.PRIVATE;
String targetId = "接收方的 userId";

SightMessage messageContent = SightMessage.obtain(mediaUri, duration);
Message message = Message.obtain(targetId, conversationType, messageContent);
RongIMClient.getInstance().sendMediaMessage(message, null, null, new IRongCallback.ISendMediaMessageCallback(){
    /**
     * 消息发送前回调, 回调时消息已存储数据库
     * @param message 已存库的消息体
     */
    @Override
    public void onAttached(Message message) {
        
    }
    /**
     * 消息发送成功
     * @param message 发送成功后的消息体
     */
    @Override
    public void onSuccess(Message message) {

    }

    /**
     * 消息发送失败
     * @param message   发送失败的消息体
     * @param errorCode 具体的错误
     */
    @Override
    public void onError(Message message, RongIMClient.ErrorCode errorCode) {

    }

    /**
     * 上传进度
     * @param message  发送的消息实体
     * @param progress 进度值: 0 - 100
     */
    @Override
    public void onProgress(Message message, int progress) {
        
    }
});
已复制
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# GIF 消息

从 SDK 2.9.21 版本开始支持发送 GIF 图片消息,默认可选择发送的 GIF 图片大小为 2M。

消息说明

消息类名 父类 ObjectName 存储属性 计数属性 离线属性 推送属性 推送内容
GIFMessage MediaMessageContent RC:GIFMsg 存储 计数 存储 推送 [图片]

参数说明

参数 类型 必填 说明 最低版本
localUri Uri 图片的 Uri
1. 仅支持 本地图片
2. 图片地址需以 file:// 开头, 不是以 file:// 开头的需拼接
2.9.25

示例代码

// 1. 仅支持本地图片
// 2. 图片地址需以 `file://` 开头, 不是以 `file://` 开头的需拼接
String path = "file://图片的路径";
Uri localUri = Uri.parse(path);

ConversationType conversationType = ConversationType.PRIVATE;
String targetId = "接收方的 userId";

GIFMessage message = new GIFMessage(localUri);
RongIMClient.getInstance().sendImageMessage(conversationType, targetId, message, null,
                null, new RongIMClient.SendImageMessageCallback() {
        /**
         * 消息发送前回调, 回调时消息已存储数据库
         * @param message 已存库的消息体
         */
        @Override
        public void onAttached(Message message) {
            
        }
        /**
         * 消息发送成功
         * @param message 发送成功后的消息体
         */
        @Override
        public void onSuccess(Message message) {

        }

        /**
         * 消息发送失败
         * @param message   发送失败的消息体
         * @param errorCode 具体的错误
         */
        @Override
        public void onError(Message message, RongIMClient.ErrorCode errorCode) {

        }

        /**
         * 上传进度
         * @param message  发送的消息实体
         * @param progress 进度值: 0 - 100
         */
        @Override
        public void onProgress(Message message, int progress) {
            
        }
    });

已复制
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49

# 发送自定义消息

除了使用 SDK 内置消息外,开发者可根据自己的业务需求来自定义消息,自定义消息的类型、消息结构需要确保多端一致,否则将出现无法互通的问题。

# 普通类消息
# 消息定义

第一步 创建 CustomMessage 继承 MessageContent (opens new window) 如下:

class CustomMessage extends MessageContent {

    // 快速构建消息对象方法
    public static CustomMessage obtain() {
        CustomMessage model = new CustomMessage();
        return model;
    }

     /**
      * 创建 CustomMessage(byte[] data) 带有 byte[] 的构造方法用于解析消息内容.
      */
     public CustomMessage(byte[] data) {
        if (data == null) {
            RLog.e(TAG, "data is null ");
            return;
        }

        String jsonStr = null;
        try {
            jsonStr = new String(data, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            Log.e(TAG, "UnsupportedEncodingException ", e);
        }

        if (jsonStr == null) {
            Log.e(TAG, "jsonStr is null ");
            return;
        }

        try {
            JSONObject jsonObj = new JSONObject(jsonStr);

            // 消息携带用户信息时, 自定义消息需添加下面代码 
            if (jsonObj.has("user")) {
                setUserInfo(parseJsonToUserInfo(jsonObj.getJSONObject("user")));
            }

            // 用于群组聊天, 消息携带 @ 人信息时, 自定义消息需添加下面代码 
            if (jsonObj.has("mentionedInfo")) {
                setMentionedInfo(parseJsonToMentionInfo(jsonObj.getJSONObject("mentionedInfo")));
            }
            
            // ...
            // 自定义消息, 定义的字段
            // ...

        } catch (JSONException e) {
            RLog.e(TAG, "JSONException " + e.getMessage());
        }

    }

    /**
     * 将本地消息对象序列化为消息数据。
     *
     * @return 消息数据。
     */
    @Override
    public byte[] encode() {
        JSONObject jsonObj = new JSONObject();
         try {
            
            // 消息携带用户信息时, 自定义消息需添加下面代码 
            if (getJSONUserInfo() != null) {
                jsonObj.putOpt("user", getJSONUserInfo());
            }

            // 用于群组聊天, 消息携带 @ 人信息时, 自定义消息需添加下面代码 
            if (getJsonMentionInfo() != null) {
                jsonObj.putOpt("mentionedInfo", getJsonMentionInfo());
            }

            // ...
            // 自定义消息, 定义的字段.
            // ...

        } catch (JSONException e) {
            RLog.e(TAG, "JSONException " + e.getMessage());
        }

        try {
            return jsonObj.toString().getBytes("UTF-8");
        } catch (UnsupportedEncodingException e) {
            Rog.e(TAG, "UnsupportedEncodingException ", e);
        }
        return null;
    }
}

已复制
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89

第二步 自定义消息实现 Parcelable 接口, 实现序列化

第三步 添加 MessageTag (opens new window) 注解

@MessageTag(value = "RC:CustomMsg", flag = MessageTag.ISCOUNTED, )
class CustomMessage extend MessageContent {

}

已复制
1
2
3
4
5
# 注册消息

在init后注册自定义消息, 才能保证自定义消息正确解析.

参数说明

参数 类型 必填 说明 最低版本
messageContentClass Class<MessageContent> 要注册的消息类型的 Class

示例代码

RongIMClient.registerMessageType(CustomMessage.class);
已复制
1
# 发送消息

PushContent 不可为 null, 否则对方将接收不到推送消息


ConversationType conversationType = ConversationType.PRIVATE
String targetId = "接收方的 userId";
// PushContent 内容, 不可为 null
String pushContent = "自定义消息";
String pushData = "自定义消息";

CustomMessage messageContent = CustomMessage.obtain();
Message message = Message.obtain(targetId, conversationType, messageContent);
RongIMClient.getInstance().sendMessage(message, pushContent, pushData, new IRongCallback.ISendMessageCallback() {
        /**
         * 消息发送前回调, 回调时消息已存储数据库
         * @param message 已存库的消息体
         */
        @Override
        public void onAttached(Message message) {
            
        }
        /**
         * 消息发送成功。
         * @param message 发送成功后的消息体
         */
        @Override
        public void onSuccess(Message message) {

        }

        /**
         * 消息发送失败
         * @param message   发送失败的消息体
         * @param errorCode 具体的错误
         */
        @Override
        public void onError(Message message, RongIMClient.ErrorCode errorCode) {

        }
    });              

已复制
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 媒体类消息
# 消息定义

第一步 创建 CustomMediaMessage 继承 MediaMessageContent 如下:

class CustomMediaMessage extend MediaMessageContent {

    // 快速构建消息对象方法
    public static CustomMediaMessage obtain() {
        CustomMediaMessage model = new CustomMediaMessage();
        return model;
    }

     /**
      * 创建 CustomMediaMessage(byte[] data) 带有 byte[] 的构造方法用于解析消息内容.
      */
     public CustomMediaMessage(byte[] data) {
        if (data == null) {
            RLog.e(TAG, "data is null ");
            return;
        }

        String jsonStr = null;
        try {
            jsonStr = new String(data, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            Log.e(TAG, "UnsupportedEncodingException ", e);
        }

        if (jsonStr == null) {
            Log.e(TAG, "jsonStr is null ");
            return;
        }

        try {
            JSONObject jsonObj = new JSONObject(jsonStr);

            // 消息携带用户信息时, 自定义消息需添加下面代码 
            if (jsonObj.has("user")) {
                setUserInfo(parseJsonToUserInfo(jsonObj.getJSONObject("user")));
            }

            // 用于群组聊天, 消息携带 @ 人信息时, 自定义消息需添加下面代码 
            if (jsonObj.has("mentionedInfo")) {
                setMentionedInfo(parseJsonToMentionInfo(jsonObj.getJSONObject("mentionedInfo")));
            }
            
            // ...
            // 自定义消息, 定义的字段
            // ...

        } catch (JSONException e) {
            RLog.e(TAG, "JSONException " + e.getMessage());
        }

    }

    /**
     * 将本地消息对象序列化为消息数据。
     * @return 消息数据。
     */
    @Override
    public byte[] encode() {
        JSONObject jsonObj = new JSONObject();
         try {
            
            // 消息携带用户信息时, 自定义消息需添加下面代码 
            if (getJSONUserInfo() != null) {
                jsonObj.putOpt("user", getJSONUserInfo());
            }

            // 用于群组聊天, 消息携带 @ 人信息时, 自定义消息需添加下面代码 
            if (getJsonMentionInfo() != null) {
                jsonObj.putOpt("mentionedInfo", getJsonMentionInfo());
            }

            // ...
            // 自定义消息, 定义的字段.
            // ...

        } catch (JSONException e) {
            RLog.e(TAG, "JSONException " + e.getMessage());
        }

        try {
            return jsonObj.toString().getBytes("UTF-8");
        } catch (UnsupportedEncodingException e) {
            Rog.e(TAG, "UnsupportedEncodingException ", e);
        }
        return null;
    }
}

已复制
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88

第二步 自定义消息实现 Parcelable 接口, 实现序列化

第三步 添加 MessageTag (opens new window) 注解

@MessageTag(value = "RC:CustomMediaMsg", flag = MessageTag.ISCOUNTED, messageHandler = CustonMediaHandler.class)
class CustomMediaMessage extends MediaMessageContent {

}

已复制
1
2
3
4
5

媒体类消息, 需要定义 CustonMediaHandler , 在 MessageTag 中指定. CustonMediaHandler 主要用于消息的处理. 例如, 文件的压缩等等操作

第四步 自定义 CustonMediaHandler

CustonMediaHandler 继承 MediaHandler 并实现抽象方法

public class CustonMediaHandler extends MessageHandler<SightMessage> {

    public CustonMediaHandler(Context context) {
        super(context);
    }

    /**
     * 解码 MessageContent 到 Message 中。
     *
     * @param message 用于存放 MessageContent 的消息实体。
     * @param content 将要被解码的 MessageContent。
     */
    @Override
    public void decodeMessage(Message message, SightMessage model) {
       
    }

    /**
     * 对 Message 编码。
     *
     * @param message 将要被编码的 Message 实体。
     */
    @Override
    public void encodeMessage(Message message) {

    }
}

已复制
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 注册消息

在init后注册自定义消息, 才能保证自定义消息正确解析.

参数说明

参数 类型 必填 说明 最低版本
messageContentClass Class<MessageContent> 要注册的消息类型的 Class

示例代码

RongIMClient.registerMessageType(CustomMediaMessage.class);
已复制
1
# 发送消息

PushContent 不可为 null, 否则对方将接收不到推送消息

ConversationType conversationType = ConversationType.PRIVATE
String targetId = "接收方的 userId";
// PushContent 内容, 不可为 null
String pushContent = "自定义消息";
String pushData = "自定义消息";

CustomMediaMessage messageContent = CustomMediaMessage.obtain();
Message message = Message.obtain(targetId, conversationType, messageContent);
RongIMClient.getInstance().sendMediaMessage(message, pushContent, pushData, IRongCallback.ISendMediaMessageCallbac(){
   /**
         * 消息发送前回调, 回调时消息已存储数据库
         * @param message 已存库的消息体
         */
        @Override
        public void onAttached(Message message) {
            
        }
        /**
         * 消息发送成功
         * @param message 发送成功后的消息体
         */
        @Override
        public void onSuccess(Message message) {

        }

        /**
         * 消息发送失败
         * @param message   发送失败的消息体
         * @param errorCode 具体的错误
         */
        @Override
        public void onError(Message message, RongIMClient.ErrorCode errorCode) {

        }

        /**
         * 上传进度
         * @param message  发送的消息实体
         * @param progress 进度值: 0 - 100
         */
        @Override
        public void onProgress(Message message, int progress) {
            
        }

        /**
         * 取消发送
         * @param message  发送的消息实体
         */
        @Override
        public void onCanceled(Message message) {
           
        }
});
                    
已复制
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56

# 配置消息推送

# MessagePushConfig 属性介绍

从 SDK 4.0.4 版本开始支持此功能,针对每条 Message 都可以设置此属性,详细查看以下参数说明。

参数 类型 说明
pushTitle String 推送标题,如果没有设置,会使用 SDK 默认的标题显示规则
pushContent String 推送内容,如果没有,则使用发送消息的 pushContent,最后则会使用 SDK 默认的标题显示规则
pushData String 远程推送附加信息,如果没有,则使用发送消息的 pushData
forceShowDetailContent boolean 是否强制显示通知详情,当目标用户通过 setPushContentShowStatus(boolean showStatus, OperationCallback callback); 设置推送不显示消息详情时,可通过此参数,强制设置该条消息显示推送详情
iOSConfig IOSConfig iOS 平台相关配置
androidConfig AndroidConfig Android 平台相关配置
# iOSConfig 属性介绍
参数 类型 说明
threadId String iOS 平台通知栏分组 ID,相同的 threadId 推送分为一组(iOS10 开始支持)
apnsCollapseId String iOS 平台通知覆盖 ID,apnsCollapseId 相同时,新收到的通知会覆盖老的通知,最大 64 字节(iOS10 开始支持)
# AndroidConfig 属性介绍
参数 类型 说明
notificationId String Android 平台 Push 唯一标识,目前支持小米、华为推送平台,默认开发者不需要进行设置,当消息产生推送时,消息的 messageUId 作为 notificationId 使用
channelIdMi String 小米的渠道 ID,该条消息针对小米使用的推送渠道,如开发者集成了小米推送,需要指定 channelId 时,可向 Android 端研发人员获取,channelId 由开发者自行创建
channelIdHW String 华为的渠道 ID,该条消息针对华为使用的推送渠道,如开发者集成了华为推送,需要指定 channelId 时,可向 Android 端研发人员获取,channelId 由开发者自行创建
channelIdOPPO String OPPO 的渠道 ID,该条消息针对 OPPO 使用的推送渠道,如开发者集成了 OPPO 推送,需要指定 channelId 时,可向 Android 端研发人员获取,channelId 由开发者自行创建
typeVivo String VIVO 推送通道类型,开发者集成了 VIVO 推送,需要指定推送类型时,可进行设置。 目前可选值 "0"(运营消息) 和 "1"(系统消息)

Channel ID 需要由开发者进行创建,创建方式如下:

推送通道 配置说明
华为 App 端,调用 Android SDK 创建 Channel ID 接口创建 Channel ID
小米 在小米开放平台管理台上创建 Channel ID 或通过小米服务端 API 创建
OPPO App 端,调用 Android SDK 创建 Channel ID;在 OPPO 管理台登记该 Channel ID,保持一致性
vivo 调用服务端 API 创建 Channel ID

示例代码

Message message = Message.obtain(mTargetId, mConversationType, textMessage);
        MessagePushConfig messagePushConfig = new MessagePushConfig.Builder().setPushTitle(title)
                .setPushContent(content)
                .setPushData(data)
                .setForceShowDetailContent(forceDetail)
                .setAndroidConfig(new AndroidConfig.Builder().setNotificationId(id).setChannelIdHW(hw).setChannelIdMi(mi).setChannelIdOPPO(oppo).setTypeVivo(vivo ? AndroidConfig.SYSTEM : AndroidConfig.OPERATE).build())
                .setIOSConfig(new IOSConfig(threadId, apnsId)).build();
        message.setMessagePushConfig(messagePushConfig);
        RongIM.getInstance().sendMessage(message, null, null, (IRongCallback.ISendMessageCallback) null);
已复制
1
2
3
4
5
6
7
8
9

文档是否解决您的问题 ?

如果遇到产品相关问题,您可 提交工单 寻求帮助