arkts-读取相册实况图片及视频内容

81 阅读1分钟

1.使用官方安全组件选择图片资源 PhotoPickerComponent 或者MovingPhotoView 选择图片资源,获取该资源的 uri 及 访问权限(选择完毕之后资源有10秒可读权限)

2.选择完毕后

// 这里以PhotoPickerComponent 举例
// 创建管理对象
let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(getContext());
// 确定访问资源的属性条例
let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates();
let fetchOptions: photoAccessHelper.FetchOptions = {
  fetchColumns: [
    photoAccessHelper.PhotoKeys.TITLE,
    photoAccessHelper.PhotoKeys.PHOTO_TYPE,
    photoAccessHelper.PhotoKeys.PHOTO_SUBTYPE,
    photoAccessHelper.PhotoKeys.SIZE,
    photoAccessHelper.PhotoKeys.WIDTH,
    photoAccessHelper.PhotoKeys.HEIGHT,
    photoAccessHelper.PhotoKeys.DURATION,
  ],
  predicates: predicates
};
// 获取资源信息
phAccessHelper.getAssets(fetchOptions).then((fetchResult) => {    
    if (photoAsset) {
        // 获取选择资源类型
        let photoType = photoAsset.get(photoAccessHelper.PhotoKeys.PHOTO_TYPE) as number
        // 因为实况图实际为特殊的jpg图片,所以先判断是不是图片,然后用子类型判断是否为实况图
        if (photoType == photoAccessHelper.PhotoType.IMAGE) {
            let subType = photoAsset.get(photoAccessHelper.PhotoKeys.PHOTO_SUBTYPE)
            // 实况图类型判断
            if (subType == photoAccessHelper.PhotoSubtype.MOVING_PHOTO){
                // 获取PhotoAsset对应的动态照片对象。
                await photoAccessHelper.MediaAssetManager.requestMovingPhoto(
                  getContext(), photoAsset, {
                  deliveryMode: photoAccessHelper.DeliveryMode.FAST_MODE
                }, {
                    async onDataPrepared(movingPhoto: photoAccessHelper.MovingPhoto) {
                        if (movingPhoto !== undefined) {
                            // 直接在沙箱路径中命名两个文件名,abc.jpg 和 abc.mp4
                            // movingPhoto.requestContent 将直接把实况图的图片和视频分别写入到这两个地址中
                            //不需要自己通过 fileIo 等形式自己创建文件
                            const fileName = `${getContext().filesDir}/${util.generateRandomUUID()}`
                            const videoFileUri = fileUri.getUriFromPath(`${fileName}.mp4`)
                            const imgFileUri = fileUri.getUriFromPath(`${fileName}.jpg`)
                            // 执行完毕后在对应沙箱目录即可看到对应的文件
                            // 具体查看方法在下边
                            await movingPhoto.requestContent(imgFileUri,videoFileUri)
                        }
                    }
                })
            }
        }
    }
    // 操作完毕后关闭资源
    fetchResult.close()
})


3.在 deveco 中查看文件 按照上边的 context.fileDir/xxxx.xxx 生成的对应路径查看方法为: 1.deveco右下角 Device File Browser 选项卡打开 2.依次打开 data->app->el2->100->base->应用包名(app.pack.name)->haps->entry->files