全部文档

更新时间: 2021-03-24

# 属性描述

消息属性 描述
消息类名 各端消息名
存储属性 存储 / 不存储
离线属性 缓存 / 不缓存
推送属性 是/否
ObjectName 传输层名称,与消息类名一一对应
计数属性 计数 / 不计数
消息尺寸 128 KB
推送内容 详见各消息类送方式
# 存储属性
存储属性 存储分类 支持平台 详细描述
存储 客户端 Android、iOS 发送、接收该消息后,本地数据库存储
Web 端 和 小程序端因本地存储不可靠,不支持客户端消息存储,但可通过历史消息云存储服务获取历史记录
存储 云端 Android、iOS、Web 默认不在云端进行存储,需开通单群聊消息云存储 (opens new window)服务,开通后,可在融云服务端存储 6 个月的历史消息,供客户端按需拉取
不存储 客户端 Android、iOS 发送、接收该消息后,本地数据库不存储
不存储 云端 Android、iOS、Web 无论是否开通历史消息云存储服务,该消息均不存储
# 计数属性

接收收到消息时,会话是否累计未读数。

计数属性 支持平台 详细描述
计数 iOS、Android、Web 会话未读消息数 + 1,该属性只影响会话列表未读数计数,App 应用角标可根据每个会话列表未读数累加获得
不计数 iOS、Android、Web 会话未读消息数不变
# 离线属性

接收人当前不在线时,是否进行离线缓存。

离线属性 详细描述
存储 消息进行离线缓存,默认 7 天。接收人在 7 天内上线,均可接收到该消息。超过 7 天后,消息被离线缓存淘汰。如有需要,可通过云端存储拉取到该消息
不存储 消息不进行离线缓存,所以只有接收人在线时,才可收到该消息。该消息不进行历史消息云存储、不进入云端存储( Log 日志 )、不进行消息同步( 消息路由 )
# 推送属性

接收人是否接收推送,当离线属性为 存储 时,该属性生效。离线属性为 不存储 时属性无效。

由于 Web、小程序、PC 端没有推送平台,无法收到推送提醒。

推送属性 平台 推送方式 详细描述
​推送 iOS、Android APNs、华为、小米、魅族、OPPO、vivo、FCM、融云 当有离线缓存消息时,进行远程推送提醒,内容为该推送提醒显示的内容
​不推送 iOS、Android -- 当有离线缓存消息时,不进行远程推送提醒

# 发送普通消息

# 文本消息

消息说明

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

参数说明

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

示例代码

String content = “消息内容”;

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

TextMessage messageContent = TextMessage.obtain(content);
Message message = Message.obtain(targetId, conversationType, messageContent);
RongIM.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
# 位置消息

消息说明

消息类名 父类 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 = "接收方 ID";

LocationMessage locationMessage = LocationMessage.obtain(lat, lng, poi, Uri.parse(path));
Message message = Message.obtain(targetId, conversationType, messageContent);
RongIM.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 存储属性 计数属性 离线属性 推送属性 推送内容
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 = "接收方 ID";
ImageMessage imageMessage = ImageMessage.obtain(null, localUri);
RongIM.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 消息类型

消息说明

消息类名 父类 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 = "接收方 ID";

HQVoiceMessage messageContent = HQVoiceMessage.obtain(audioUri, duration);
Message message = Message.obtain(targetId, conversationType, messageContent)
RongIM.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 = "接收方 ID";

FileMessage messageContent = FileMessage.obtain(uri);
Message message = Message.obtain(targetId, conversationType, messageContent);
RongIM.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
# 小视频消息
  1. 使用小视频功能需要到融云开发者后台 (opens new window)服务管理-> 小视频-> 服务设置 中开通小视频功能.

  2. SDK 2.8.29 版本开始支持小视频功能。小视频消息默认存储 6 个月,如有特殊需求或需要存储更长时间,请联系商务,电话:13161856839

融云提供了小视频功能. 可拍摄生成 10 秒 小视频消息功能及在本地相册中选择视频文件发送功能,支持单聊、群组、聊天室会话场景。

集成方式

  1. 融云官网下载小视频 Sight 组件

  2. 在主工程中的 build.gradle 中添加

 api project(':Sight')
已复制
1
  1. 注册插件
RongExtensionManager.getInstance().registerExtensionModule(new SightExtensionModule());

已复制
1
2

完成以上步骤,会话页面扩展功能中即增加了 小视频 功能.

发送本地视频

在 IMkit 的 res/value 下的 rc_config.xml 文件中设置以下配置, 即可使用本地发送小视频功能. 功能默认关闭.

<!--选择媒体资源时,是否包含视频文件, true 为打开, false 为关闭-->
<bool name="rc_media_selector_contain_video">true</bool>
已复制
1
2
  1. 支持发送本地视频文件,时长上限为 2 分钟.
  2. 使用 Maven 集成的, 可在主工程的 res/value 下创建 rc_config.xml 文件, 并把上述开关配置复制粘贴到文件中即可. 工程优先加载主工程 rc_config.xml 中的配置项.

发送小视频消息

消息说明

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

参数说明

参数 类型 必填 说明
mediaUri Uri 本地视频文件的 Uri
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 = "接收方 ID";

SightMessage messageContent = SightMessage.obtain(mediaUri, duration);
Message message = Message.obtain(targetId, conversationType, messageContent);
RongIM.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,接收于小于 1M 的消息时自动下载显示,大于 1M 时需要手动点击下载。

消息说明

消息类名 父类 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 = "接收方 ID";

GIFMessage message = new GIFMessage(localUri);
RongIM.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

示例代码

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

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


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

CustomMessage messageContent = CustomMessage.obtain();
Message message = Message.obtain(targetId, conversationType, messageContent);
RongIM.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 = "接收方 ID";
// PushContent 内容, 不可为 null
String pushContent = "自定义消息";
String pushData = "自定义消息";

CustomMediaMessage messageContent = CustomMediaMessage.obtain();
Message message = Message.obtain(targetId, conversationType, messageContent);
RongIM.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
# 显示消息

融云 IMKit SDK 中每一种消息类型(在 UI 展示的)都对应一个 Provider 用于界面展示. 可通过给自定义消息创建对应的 Provider 使自定义消息展示在消息列表中.

自定义步骤

  1. 创建类 MyMessageItemProvider 继承 MessageProvider , 并给类添加注解.
@ProviderTag (messageContent = MyMessage.class)
public class MyMessageItemProvider extends MessageProvider{
    class ViewHolder {
        ...
    }

    @Override
    public View newView(Context context, ViewGroup group) {
        View view = LayoutInflater.from(context).inflate(R.layout.item_custom_message, null);
        view.setTag(holder);
        return view;
    }

    @Override
    public void bindView(View v, int position, CustomizeMessage content, Message message) {
        
    }

    @Override
    public Spannable getContentSummary(CustomizeMessage data) {
        return new SpannableString("这是一条自定义消息CustomizeMessage");
    }

    @Override
    public void onItemClick(View view, int position, CustomizeMessage content, Message message) {

    }

    @Override
    public void onItemLongClick(View view, int position, CustomizeMessage content, 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

注解 ProviderTag 说明

注解属性

属性 描述
messageContent 对应的消息类型 ( 如:TextMessage.class )
showPortrait 设置是否显示头像,默认为 true
centerInHorizontal 消息内容是否横向居中,默认 false
hide 是否隐藏消息, 默认 false
showProgress 是否显示发送进度,默认 true
showSummaryWithName 是否在会话的内容体里显示发送者名字,默认 true
  1. 重新注册该消息模板,注册方法应在 init 后注册消息模版
RongIM.getInstance().registerMessageTemplate(new MyMessageItemProvider());
已复制
1

# 配置消息推送

# 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

文档是否解决您的问题 ?

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