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