下载与展示媒体消息
SDK 提供多媒体文件的下载功能,支持通过媒体消息中的地址下载文件。
下载媒体消息中的媒体文件
如果消息 Message 对象中包含媒体消息内容(指 Message.content
为 MediaMessageContent 子类(如 FileMessage,ImageMessage, HQVoiceMessage 等),其中携带了媒体文件地址),可以使用 downloadMediaMessage
下载媒体文件。
提示
- 首次下载媒体消息,SDK 会将媒体数据保存到
localPath
中返回。同一个媒体消息多次调用下载接口,SDK 只会下载一次。 - 1.3.0 废弃
downloadMediaMessage
方法,使用downloadMediaMessageWithProgress
替代。
示例代码
TypeScript
let messageId = 234;
IMEngine.getInstance().downloadMediaMessage(messageId).then(result => {
if (EngineError.Success === result.code) {
// 本地路径
let localPath = result.data as string;
}
});
下载媒体消息中的媒体文件(带下载进度)
1.3.0 支持该功能,包含下载进度。
提示
- 首次下载媒体消息,SDK 会将媒体数据保存到
localPath
中返回。同一个媒体消息多次调用下载接口,SDK 只会下载一次。 - SDK 下载媒体过程中,调用了
cancelDownloadMediaMessage()
,该方法会返回EngineError.RequestCanceled
。
接口原型
TypeScript
public downloadMediaMessageWithProgress(messageId: number, progressListener: (messageId: number, progress: number) => void): Promise<IAsyncResult<string>>;
参数说明
参数名 | 类型 | 详细说明 |
---|---|---|
messageId | number | 要下载的媒体消息 ID(必须为有效的媒体消息) |
progressListener | (messageId: number, progress: number) => void | 下载进度回调函数 |
示例代码
TypeScript
let messageId = 123;
IMEngine.getInstance().downloadMediaMessageWithProgress(messageId, (messageId: number, progress: number) => {
// 下载进度,取值范围 [0 , 100]
}).then(result => {
if (EngineError.Success === result.code) {
// 本地路径
let localPath = result.data as string;
}
});
使用自定义方法下载媒体消息
您可在下载媒体消息时使用 downloadMediaMessageWithDownloader
方法,自行管理媒体消息的如视频、图片资源文件。
提示
IMLib SDK 从 1.4.3 版本开始支持该功能。
示例代码
TypeScript
let messageId = 234;
IMEngine.getInstance().downloadMediaMessageWithDownloader(
messageId,
(messageId: number, progress: number) => {
// 下载进度,取值范围 [0 , 100]
},
(downloader: MediaMessageTransfer) => {
downloadImg(imgMsg.getPicFilePath(), new downloadListener() {
public onSuccess(localPath: string): void {
downloader.success(localPath);
}
}
}
).then(result => {
if (EngineError.Success === result.code) {
// 本地路径
let localPath = result.data as string;
}
});
暂停下载媒体消息
您可以通过调用 pauseDownloadMediaMessage
方法,暂停正在下载中的媒体消息。对于已暂停下载的媒体消息,再次调用 downloadMediaMessageWithProgress
,该媒体消息会接着之前的下载进度继续下载。
示例代码
TypeScript
let messageId = 123;
IMEngine.getInstance().pauseDownloadMediaMessage(messageId).then(result => {
if (EngineError.Success === result.code) {
// 暂停下载成功,此时 downloadMediaMessageWithProgress 会返回 EngineError.RequestPaused
} else {
// 暂停下载失败
}
});
取消下载媒体消息
提示
- SDK 1.3.0 版本后支持该功能
- 取消下载之后,再次调用下载方法,SDK 会重新下载。
接口原型
TypeScript
public cancelDownloadMediaMessage(messageId: number): Promise<IAsyncResult<void>>;
参数说明
参数名 | 类型 | 详细说明 |
---|---|---|
messageId | number | 要取消下载的媒体消息 ID |
示例代码
TypeScript
let messageId = 123;
IMEngine.getInstance().cancelDownloadMediaMessage(messageId).then(result => {
if (EngineError.Success === result.code) {
// 下载取消成功
} else {
// 下载取消失败
}
});
展示媒体消息
展示图片消息
在聊天页面展示图片消息的缩略图,点击图片消息进入图片预览时加载图片大图。鸿蒙的 Image 组件可以支持加载 base64 格式 ,本地路径和远端地址的图片。
展示图片 base64 缩略图
- 创建 base64
TypeScript
// 此处 imgContent 简写
let imgContent : ImageMessage;
let imgBase64 = "data:image/png;base64," + imgContent.thumbnailBase64;
- 用 Image 控件展示 base64
TypeScript
Image(imgBase64).width(200)
展示图片大图
- 获取大图地址工具方法
TypeScript
import fileUri from "@ohos.file.fileuri";
private getImageUrl(imgContent: ImageMessage): string {
// 如果本地路径存在
if (StringChecker.isValid(imgContent.localPath)) {
let localPath = imgContent.localPath;
// 使用 fileUri 修正路径后返回本地路径
localPath = fileUri.getUriFromPath(localPath);
return localPath;
}
// 如果本地路径不存在,直接返回远端地址
return imgContent.remoteUrl;
}
- 获取大图地址
TypeScript
// 此处 imgContent 简写
let imgContent : ImageMessage;
let imgUrl = this.getImageUrl(imgContent);
- 用 Image 控件展示大图
TypeScript
Image(imgUrl).width(600)