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

1 回复

更多关于HarmonyOS鸿蒙Next中如何解决读取图库中的视频文件宽度出现Crash的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,读取图库中的视频文件宽度时出现Crash,可能是由于以下几个原因导致的:

  1. 权限问题:确保应用已经获取了读取外部存储的权限。可以通过在config.json文件中声明ohos.permission.READ_MEDIA权限,并在运行时动态申请权限。

  2. 视频文件路径错误:检查获取的视频文件路径是否正确。可以使用ohos.file.fs模块中的getFileAccessHelper来获取文件路径,并确保路径有效。

  3. 视频文件格式不支持:鸿蒙系统可能不支持某些视频格式。可以使用ohos.multimedia.media模块中的MediaMetadataRetriever来获取视频的元数据,包括宽度、高度等信息。如果视频格式不支持,可能会导致Crash。

  4. 内存问题:读取大视频文件时,可能会因为内存不足导致Crash。可以使用MediaMetadataRetrieverextractMetadata方法来获取视频的宽度,而无需将整个视频文件加载到内存中。

  5. 系统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问题。

回到顶部