发送媒体消息
媒体消息
媒体消息指图片、文件等需要处理媒体文件上传的消息。媒体消息的消息内容类型为 MediaMessageContent 的子类,例如高清语音消息内容(HQVoiceMessage)。
SDK 支持自定义媒体消息,关于自定义媒体消息更多内容,请查看自定义消息。
获取媒体消息本地路径
鸿蒙系统内部获取媒体路径可以分为两类
- 从沙箱中获取:类似于 iOS 的沙盒机制,鸿蒙的应用程序只能访问自己的沙箱目录,无法访问其他应用程序的沙箱目录。
- 沙箱路径 SDK 可以直接访问
- 从系统路径获取:例如系统相册,系统文件管理等
- 系统路径 SDK 无法直接访问,需要将系统路径媒体文件拷 贝到沙箱路径
- 可以使用下面的代码将系统路径文件拷贝到沙箱路径
示例代码
TypeScript
import fs from '@ohos.file.fs';
import { ArrayChecker, StringChecker } from '@rongcloud/imlib';
/**
* 将系统路径文件复制到沙盒工具类
*/
class SandboxUtil {
/**
* 将相册图片或者文件管理中文件批量复制到沙盒
* @param context 上下文
* @param uris 系统路径数组
* @returns 沙盒路径数组
*/
public static async copyToSandbox(context: Context, uris: Array<string>): Promise<Array<string>> {
let targetList = new Array<string>();
if (!ArrayChecker.isValid(uris)) {
return targetList;
}
for (let u of uris) {
let file = await fs.open(u, fs.OpenMode.READ_ONLY);
let targetPath = context.cacheDir + "/" + file.name;
fs.closeSync(file);
targetPath = "file://" + targetPath;
await fs.copy(u, targetPath);
targetList.push(targetPath);
}
return targetList;
}
/**
* 将单个系统媒体路径的媒体资源复制到沙盒
* @param context 上下文
* @param uri 系统路径
* @returns 沙盒路径
*/
public static async copyOneToSandbox(context: Context, uri: string) : Promise<string> {
let retUri = "";
if (StringChecker.isEmpty(uri)) {
return retUri;
}
let file = await fs.open(uri, fs.OpenMode.READ_ONLY);
let targetPath = context.cacheDir + "/" + file.name;
fs.closeSync(file);
targetPath = "file://" + targetPath;
await fs.copy(uri, targetPath);
return targetPath;
}
}
export { SandboxUtil }
选择相册和文件管理中的文件资源参考鸿蒙文档。
发送媒体消息
接口原型
TypeScript
public sendMediaMessage(
msg: Message,
progressListener?: (msg: Message, progress: number) => void
): Promise<IAsyncResult<Message>>;
sendMediaMessage
方法使用消息推送属性配置 PushConfig
,其中包含了 pushContent
和 pushData
。
关于是否需要配置输入参数或 Message
的 pushConfig
属性中 pushContent
,请参考以下内容:
- 如果消息类型为即时通讯服务预定义消息类型中的用户内容类消息格式,例如 TextMessage,
pushContent
可设置为null
。一旦消息触发离线推送通知时,远程推送通知默认使用服务端预置的推送通知内容。关于各类型消息的默认推送通知内容,详见用户内容类消息格式。 - 如果消息类型为即时通讯服务预定义消息类型中通知类、信令类("撤回命令消息" 除外),且需要支持远程推送通知,则必须填写
pushContent
,否则收件人不在线时无法收到远程推送通知。如无需触发远程推送,可不填该字段。 - 如果消息类型为自定义消息类型,请参考自定义消息如何支持远程推送。
- 请注意,聊天室会话不支持离线消息机制,因此也不支持离线消息转推送。