发送消息
IMKit 内置会话页面已实现了发送各类型消息的功能和 UI(部分消息类型需要插件支持)。当您在自定义页面需要发送消息时,可使用 IMKit 核心类 IMCenter
或 RongIM
下发送消息的方法。这些方法除了提供发送消息的功能外,还会触发 IMKit 内置页面的更新。
IMKit 支持发送普通消息和媒体类消息(参考消息介绍),普通消息父类是 MessageContent,媒体消息父类是 MediaMessageContent。发送媒体消息和普通消息本质的区别为是否有上传数据过程。
重要
- 请务必使用 IMKit 核心类
IMCenter
或RongIM
下发送消息的方法,否则不会触发页面刷新。发送普通消息使用sendMessage
方法,发送媒体消息使用sendMediaMessage
方法。- 客户端 SDK 发送消息存在频率限制,每秒最多只能发送 5 条消息。
发送普通消息
发送消息前需要构造 Message
消息对象。消息的 content
字段中必须包含普通消息内容(即 MessageContent 的子类),如文本消息(TextMessage)。
调用 RongIM
或 IMCenter
的发送消息方法时,SDK 会触发内置的会话列表和会话页面的更新。
String targetId = "会话 Id";
ConversationType conversationType = ConversationType.PRIVATE;
TextMessage messageContent = TextMessage.obtain("消息内容");
Message message = Message.obtain(targetId, conversationType, messageContent);
IMCenter.getInstance().sendMessage(message, null, null, new IRongCallback.ISendMessageCallback() {
@Override
public void onAttached(Message message) {
}
@Override
public void onSuccess(Message message) {
}
@Override
public void onError(Message message, RongIMClient.ErrorCode errorCode) {
}
});
sendMessage
中直接提供了用于控制推送通知内容(pushContent
)和推送附加信息(pushData
)的参数。不过,如果您需要更精细地控制离线推送通知,例如标题、内容、图标、或其他第三方厂商个性化配置,请使用消息推送属性进行配置,详见自定义消息推送通知。请注意,聊天室会话不支持离线消息机制,因此也不支持离线消息转推送。
- 如果发送的消息属于 SDK 内置消息类型,例如 TextMessage,这两个参数可设置为
null
。一旦消息触发离线推送通知时,融云服务端会使用各个内置消息类型默认的pushContent
值。关于各类型消息的默认推送通知内容,详见用户内容类消息格式。 - 如果消息类型为自定义消息类型,且需要支持离线推送通知,则必须向融云提供
pushContent
字段,否则用户无法收到离线推送通知。 - 如果消息类型为自定义消息类型,但不需要支持远程推送通知(例如通过自定义消息类型实现的 App 业务层操作指令),可将
pushContent
字段留空。 Message
的推送属性配置MessagePushConfig
的pushContent
和pushData
会覆盖此处配置,并提供更多配置能力,例如自定义推送通知的标题。详见自定义消息推送通知。
参数 | 类型 | 说明 |
---|---|---|
message | Message | 要发送的消息体。详见消息介绍 中对 Message 的结构说明。 |
pushContent | String | 修改或指定远程消息推送通知栏显示的内容。您也可以在 Message 的推送属性(MessagePushConfig )中配置,会覆盖此处配置,详见下文自定义消息推送通知。
|
pushData | String | 远程推送附加信息。如果设置该字段,用户在收到远程推送消息时,能通过 io.rong.push.notification.PushNotificationMessage#getPushData() 方法获取。您也可以在 Message 的推送属性(MessagePushConfig )中配置,会覆盖此处配置,详见下文自定义消息推送通知。 |
callback | ISendMessageCallback | 发送消息的回调 |
发送媒体消息
媒体消息 Message
对象的 content
字段必须传入 MediaMessageContent 的子类对象,表示媒体消息内容。例如图片消息(ImageMessage)、GIF 消息(GIFMessage)等。其他内置媒体消息类型包括文件消息(FileMessage)、位置消息(LocationMessage
)、高清语音消息(HQVoiceMessage)、小视频消息(SightMessage),建议先集成相应的 IMKit 插件。
图片消息内容(ImageMessage)支持设置为发送原图。
String targetId = "目标 ID";
ConversationType conversationType = ConversationType.PRIVATE;
Uri localUri = Uri.parse("file://图片的路径");//图片本地路径,接收方可以通过 getThumUri 获取自动生成的缩略图 Uri
boolean mIsFull = true; //是否发送原图
ImageMessage mediaMessageContent = ImageMessage.obtain(localUri, mIsFull);
Message message = Message.obtain(targetId, conversationType, mediaMessageContent);
发送媒体消息需要使用 sendMediaMessage
方法。SDK 会为图片、小视频等生成缩略图,根据默认压缩配置进行压缩,再将图片、小视频等媒体文件上传到融云默认的文件服务器(文件存储时长),上传成功之后再发送消息。图片消息如已设置为发送原图,则不会进行压缩。
调用 RongIM
或 IMCenter
的发送消息方法时,SDK 会根据发送状态同步更新内置的会话列表和会话页面。
IMCenter.getInstance().sendMediaMessage(message, null, null, new IRongCallback.ISendMediaMessageCallback() {
@Override
public void onProgress(Message message, int i) {
}
@Override
public void onCanceled(Message message) {
}
@Override
public void onAttached(Message message) {
}
@Override
public void onSuccess(Message message) {
}
@Override
public void onError(final Message message, final RongIMClient.ErrorCode errorCode) {
}
});
sendMediaMessage
中直接提供了用于控制推送通知内容(pushContent
)和推送附加信息(pushData
)的参数。不过,如果您需要更精细地控制离线推送通知,例如标题、内容、图标、或其他第三方厂商个性化配置,请使用消息推送属性进行配置,详见自定义消息推送通知。请注意,聊天室会话不支持离线消息机制,因此也不支持离线消息转推送。
- 如果发送的消息属于 SDK 内置的媒体消息 类型,例如 ImageMessage,这两个参数可设置为
null
。一旦消息触发离线推送通知时,融云服务端会使用各个内置消息类型默认的pushContent
值。关于各类型消息的默认推送通知内容,详见用户内容类消息格式。 - 如果消息类型为自定义消息类型,且需要支持离线推送通知,则必须向融云提供
pushContent
字段,否则用户无法收到离线推送通知。 - 如果消息类型为自定义消息类型,但不需要支持远程推送通知(例如通过自定义消息类型实现的 App 业务层操作指令),可将
pushContent
字段留空。 Message
的推送属性配置MessagePushConfig
的pushContent
和pushData
会覆盖此处配置,并提供更多配置能力,例如自定义推送通知的标题。详见自定义消息推送通知。
参数 | 类型 | 说明 |
---|---|---|
message | Message | 要发送的消息体。消息的 content 字段必须为媒体消息内容 MediaMessageContent。详见消息介绍 中对 Message 的结构说明。 |
pushContent | String | 修改或指定远程消息推送通知栏显示的内容。您也可以在 Message 的推送属性(MessagePushConfig )中配置,会覆盖此处配置,详见下文自定义消息推送通知。
|
pushData | String | 远程推送附加信息。如果设置该字段,用户在收到远程推送消息时,能通过 io.rong.push.notification.PushNotificationMessage#getPushData() 方法获取。您也可以在 Message 的推送属性(MessagePushConfig )中配置,会覆盖此处配置,详见下文自定义消息推送通知。 |
callback | ISendMediaMessageCallback | 发送多媒体消息的回调 |
发送多媒体消息并且上传到自己的服务器
SDK 支持由 App 自行处理媒体文件上传逻辑(可上传到自己的服务器),然后再发送消息,同时 SDK 会更新 UI 状态。
您需要使用 sendMediaMessage
方法发送媒体消息,在回调接口 ISendMediaMessageCallbackWithUploader 的 onAttached
回调方法中自行实现媒体文件上传,并上传成功后通知 SDK,并提供回媒体文件的远端地址。
String path = "file://图片的路径";
Uri localUri = Uri.parse(path);
ConversationType conversationType = ConversationType.PRIVATE;
String targetId = "会话 Id";
ImageMessage imageMessage = ImageMessage.obtain(localUri, localUri);
Message message = Message.obtain(targetId, conversationType, imageMessage);
RongIM.getInstance().sendMediaMessage(message, null, null, new IRongCallback.ISendMediaMessageCallbackWithUploader() {
@Override
public void onAttached(Message message, final MediaMessageUploader uploader) {
/*上传图片到自己的服务器*/
uploadImg(imgMsg.getPicFilePath(), new UploadListener() {
@Override
public void onSuccess(String url) {
// 上传成功,回调 SDK 的 success 方法,传递回图片的远端地址
uploader.success(Uri.parse(url));
}
@Override
public void onProgress(float progress) {
//刷新上传进度
uploader.update((int) progress);
}
@Override
public void onFail() {
// 上传图片失败,回调 error 方法。
uploader.error();
}
});
}
@Override
public void onError(Message message, RongIMClient.ErrorCode errorCode) {
//发送失败
}
@Override
public void onSuccess(Message message) {
//发送成功
}
@Override
public void onProgress(Message message, int progress) {
//发送进度
}
});
参数 | 类型 | 说明 |
---|---|---|
message | Message | 发送消息的实体 |
pushContent | String | 修改或指定远程消息推送通知栏显示的内容。您也可以在 Message 的推送属性(MessagePushConfig )中配置,会覆盖此处配置,详见下文自定义消息推送通知。
|
pushData | String | 远程推送附加信息。如果设置该字段,用户在收到远程推送消息时,能通过 io.rong.push.notification.PushNotificationMessage#getPushData() 方法获取。您也可以在 Message 的推送属性(MessagePushConfig )中配置,会覆盖此处配置,详见下文自定义消息推送通知。 |
callback | ISendMediaMessageCallbackWithUploader | 发送多媒体消息并上传到自己服务器的回调。IRongCallback 中的 MediaMessageUploader 可以直接参考 IRongCoreCallback.MediaMessageUploader。 |
发送定向普通消息
IMCenter
提供 sendDirectionalMessage
方法,支持向群组中特定的某些用户发送消息,会话中其他用户将不会收到此消息。
使用该方法发送普通定向消息前,不需要构造 Message 对象。请在 MessageContent
参数中直接传入 MessageContent 子类示例,例如文本消息(TextMessage)。
IMCenter.getInstance().sendDirectionalMessage(conversationType, targetId, messageContent, userIds, pushContent, pushData, callback);
参数 | 类型 | 说明 |
---|---|---|
conversationType | ConversationType | 会话类型,必须为 ConversationType.GROUP |
targetId | String | 会话 Id |
messageContent | MessageContent | 消息的具体内容。只支持普通类型消息,不支持多媒体类型消息。 |
userIds | String[] | 会话中将会接收到此消息的用户列表. |
pushContent | String | 修改或指定远程消息推送通知栏显示的内容。您也可以在 Message 的推送属性(MessagePushConfig )中配置,会覆盖此处配置,详见下文自定义消息推送通知。
|
pushData | String | push 附加信息。您也可以在 Message 的推送属性(MessagePushConfig )中配置,会覆盖此处配置,详见下文自定义消息推送通知。 |
callback | IRongCallback.ISendMessageCallback | 发送消息的回调。 |
发送定向媒体消息
IMCenter
提供 sendDirectionalMediaMessage
方法,支持向群组中特定的某些用户发送消息,会话中其他用户将不会收到此消息。
使用该方法发送普通定向消息前,不需要构造 Message 对象。请在 MessageContent
参数中直接传入 MessageContent 子类示例,例如文本消息(ImageMessage)。
IMCenter.getInstance().sendDirectionalMessage(conversationType, targetId, messageContent, userIds, pushContent, pushData, callback);
参数 | 类型 | 说明 |
---|---|---|
conversationType | ConversationType | 会话类型。必须为 ConversationType.GROUP |
targetId | String | 会话 ID |
messageContent | MediaMessageContent | 媒体消息的具体内容。只支持多媒体型消息,不支持普通类型消息。 |
userIds | String[] | 会话中将会接收到此消息的用户列表. |
pushContent | String | 修改或指定远程消息推送通知栏显示的内容。您也可以在 Message 的推送属性(MessagePushConfig )中配置,会覆盖此处配置,详见下文自定义消息推送通知。
|
pushData | String | push 附加信息。您也可以在 Message 的推送属性(MessagePushConfig )中配置,会覆盖此处配置,详见下文自定义消息推送通知。 |
callback | IRongCallback.ISendMediaMessageCallback | 发送消息的回调。 |
自定义消息推送通知
IMKit 支持对单条消息的推送行为添加个性化配置(MessagePushConfig),但并未在 UI 上实现。如有需要,您可以在发送时拦截消息添加配置。拦截方式与为消息禁用推送通知一致。
在发送消息时,您可以通过设置消息的 MessagePushConfig 对象,对单条消息的推送行为进行个性化配置。例如:
- 自定义推送标题、推送通知内容
- 自定义通知栏图标
- 添加远程推送附加信息
- 越过接收客户端的配置,强制在推送通知内显示通知内容
- 其他 APNs 或 Android 推送通道支持的个性化配置
相对于发送消息方法输入参数中的 pushContent
和 pushData
,MessagePushConfig
中的配置具有更高优先级。发送消息时,如已配置 MessagePushConfig
,则优先使用 MessagePushConfig
中的配置。
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)
.setCategoryHW("IM")
.setChannelIdMi(mi)
.setChannelIdOPPO(oppo)
.setTypeVivo(vivo ? AndroidConfig.SYSTEM : AndroidConfig.OPERATE)
.setCategoryVivo("IM")
.build())
.setIOSConfig(new IOSConfig(threadId, apnsId)).setTemplateId("")
build();
message.setMessagePushConfig(messagePushConfig);
// 请根据消息类型调用对应的发送方法