HarmonyOS鸿蒙Next中如何解决读取图库中的视频文件宽度出现Crash
HarmonyOS鸿蒙Next中如何解决读取图库中的视频文件宽度出现Crash
【问题现象】
发布图文笔记,在系统相册内进行图片或视频选择后,拿到系统相册资源的filepath,后续进行内容发布时,发布接口需要获取图片/视频资源的宽高信息。图库选择视频文件后,通过photoAccessHelper.PhotoAsset.get(photoAccessHelper.PhotoKeys.WIDTH)获取宽度出现Crash。
问题代码如下:
async uriGetAssets() {
try {
let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(this.context);
let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates();
// 配置查询条件,使用PhotoViewPicker选择图片返回的uri进行查询
predicates.equalTo('uri', this.uri);
let fetchOption: photoAccessHelper.FetchOptions = {
fetchColumns: [],
predicates: predicates
};
let fetchResult: photoAccessHelper.FetchResult<photoAccessHelper.PhotoAsset> = await phAccessHelper.getAssets(fetchOption);
// 得到uri对应的PhotoAsset对象,读取文件的部分信息
const asset: photoAccessHelper.PhotoAsset = await fetchResult.getFirstObject();
console.info('asset displayName: ', asset.displayName);
console.info('asset uri: ', asset.uri);
console.info('asset photoType: ', asset.photoType);
// 下面代码获取宽高会报错
console.info('asset width: ', asset.get(photoAccessHelper.PhotoKeys.WIDTH));
console.info('asset height: ', asset.get(photoAccessHelper.PhotoKeys.HEIGHT));
} catch (error) {
console.error('uriGetAssets failed with err: ' + JSON.stringify(error));
}
}
【背景知识】
【定位思路】
通过指南可知报错码14000014对应的错误内容为“Member is not a valid PhotoKey.”,即width和height为非法key。出现这种错误有两个可能:
- 读取视频文件失败,width和height不存在。
- 获取宽高的方式错误。
但实际上视频是成功读取的,排除第一种可能,所以问题出在获取方式。
检查photoAccessHelper.PhotoAsset.get()接口是否支持获取视频文件的宽度和高度。
通过接口文档可知,get接口仅支持’uri’、‘media_type’、‘subtype’、'display_name’四个属性的查询,其他查询需要在fetchColumns中填入需要get的PhotoKeys,例如:get title属性fetchColumns: [‘title’]。
【解决方案】
在fetchColumns中填入需要get的PhotoKeys进行宽度/高度查询,如下填入了宽度,高度,标题进行查询。
// 在配置项的fetchColumns中添加需要获得的宽度,高度以及标题的属性
let fetchOption: photoAccessHelper.FetchOptions = {
fetchColumns: ['width','height'],
predicates: predicates
};
添加后获取的结果:
【总结】
photoAccessHelper.PhotoAsset.get()接口仅支持’uri’、‘media_type’、‘subtype’、'display_name’四个属性的查询,其他查询需要在fetchColumns中填入需要get的PhotoKeys。
更多关于HarmonyOS鸿蒙Next中如何解决读取图库中的视频文件宽度出现Crash的实战教程也可以访问 https://www.itying.com/category-93-b0.html
更多关于HarmonyOS鸿蒙Next中如何解决读取图库中的视频文件宽度出现Crash的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next中,读取图库中的视频文件宽度时出现Crash,可能是由于以下几个原因导致的:
-
权限问题:确保应用已经获取了读取外部存储的权限。可以通过在
config.json
文件中声明ohos.permission.READ_MEDIA
权限,并在运行时动态申请权限。 -
视频文件路径错误:检查获取的视频文件路径是否正确。可以使用
ohos.file.fs
模块中的getFileAccessHelper
来获取文件路径,并确保路径有效。 -
视频文件格式不支持:鸿蒙系统可能不支持某些视频格式。可以使用
ohos.multimedia.media
模块中的MediaMetadataRetriever
来获取视频的元数据,包括宽度、高度等信息。如果视频格式不支持,可能会导致Crash。 -
内存问题:读取大视频文件时,可能会因为内存不足导致Crash。可以使用
MediaMetadataRetriever
的extractMetadata
方法来获取视频的宽度,而无需将整个视频文件加载到内存中。 -
系统API调用错误:检查代码中调用系统API的方式是否正确。确保使用正确的API版本,并遵循鸿蒙系统的开发规范。
以下是一个示例代码片段,展示如何使用MediaMetadataRetriever
获取视频宽度:
import media from '@ohos.multimedia.media';
let mediaMetadataRetriever = new media.MediaMetadataRetriever();
mediaMetadataRetriever.setSource('/path/to/video/file');
let width = mediaMetadataRetriever.extractMetadata(media.MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH);
console.log('Video width:', width);
mediaMetadataRetriever.release();
通过以上方法,可以有效地解决读取图库中的视频文件宽度时出现的Crash问题。