更新时间: 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) { } });
已复制
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) { } });
已复制
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 |
- 不设置缩率图, SDK 内部会自动生成缩率图. 缩率图会以 Base64 的形式传给接收方.
- 原图如果超过限制, 会进行压缩. 然后上传服务器.
示例代码
// 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) { } });
已复制
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) { } });
已复制
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) { } });
已复制
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)的 服务管理-> 小视频-> 服务设置 中开通小视频功能.
SDK 2.8.29 版本开始支持小视频功能。小视频消息默认存储 6 个月,如有特殊需求或需要存储更长时间,请联系商务,电话:13161856839
融云提供了小视频功能. 可拍摄生成 10 秒 小视频消息功能及在本地相册中选择视频文件发送功能,支持单聊、群组、聊天室会话场景。
集成方式
融云官网下载小视频 Sight 组件
在主工程中的
build.gradle
中添加
api project(':Sight')
已复制
- 注册插件
RongExtensionManager.getInstance().registerExtensionModule(new SightExtensionModule());
已复制
2
完成以上步骤,会话页面扩展功能中即增加了 小视频 功能.
发送本地视频
在 IMkit 的 res/value
下的 rc_config.xml
文件中设置以下配置, 即可使用本地发送小视频功能. 功能默认关闭.
<!--选择媒体资源时,是否包含视频文件, true 为打开, false 为关闭--> <bool name="rc_media_selector_contain_video">true</bool>
已复制
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) { } });
已复制
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) { } });
已复制
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; } }
已复制
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 { }
已复制
2
3
4
5
# 注册消息
在init后注册自定义消息, 才能保证自定义消息正确解析.
参数说明
参数 | 类型 | 必填 | 说明 | 最低版本 |
---|---|---|---|---|
messageContentClass | Class<MessageContent> | 是 | 要注册的消息类型的 Class |
示例代码
RongIM.registerMessageType(CustomMessage.class);
已复制
# 发送消息
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) { } });
已复制
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; } }
已复制
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 { }
已复制
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) { } }
已复制
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);
已复制
# 发送消息
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) { } });
已复制
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 使自定义消息展示在消息列表中.
自定义步骤
- 创建类
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) { } }
已复制
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 |
- 重新注册该消息模板,注册方法应在 init 后注册消息模版
RongIM.getInstance().registerMessageTemplate(new MyMessageItemProvider());
已复制
# 配置消息推送
# 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);
已复制
2
3
4
5
6
7
8
9