HarmonyOS 鸿蒙Next 如何解决PhotoViewPicker已选择图片再次进入未默认选中的问题
【问题现象】
通过Media Library Kit的PhotoViewPicker实现选择系统相册图片,之前选择的图片没有默认选中。
预期效果:选择图片完成提交–下次进入标记选中状态(不完成提交下次进入不选中)。
实际效果:选择图片–完成提交–下次进入未标记选中状态。
【背景知识】
Media Library Kit中通过PhotoViewPicker实现选择系统相册图片时,可以使用PhotoSelectOptions属性控制选择的媒体文件类型、数量、预选择文件数据、推荐的媒体文件等。
【解决方案】
PhotoViewPicker选择图片时不会对选择结果进行记录,建议可以自行保存每次选择的图片uri,再通过PhotoSelectOptions属性设置预选的图片数据。
(1)将每次选择的图片URI缓存到数组preSelected中。
代码示例如下:
photoPicker.select(photoSelectOptions).then((PhotoSelectResult: photoAccessHelper.PhotoSelectResult) => {
//select方法:在选择图片点击完成之后, PhotoSelectResult.photoUris 返回选中的uri,缓存到preSelected中
this.preSelected= PhotoSelectResult.photoUris
})
(2)通过 PhotoSelectOptions中preselectedUris属性,将缓存的uri设置为预选择的图片。
代码示例如下:
let photoSelectOptions = new photoAccessHelper.PhotoSelectOptions();
// 将上次选择的图片设置为本次预选图片
photoSelectOptions.preselectedUris = this.preSelected
photoPicker.select(photoSelectOptions).then((PhotoSelectResult: photoAccessHelper.PhotoSelectResult) => {
...
})
最终代码示例如下:
// 缓存选择的图片uri
preSelected:Array<string> = []
selectImage() {
try {
let photoSelectOptions = new photoAccessHelper.PhotoSelectOptions();
photoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE;
photoSelectOptions.maxSelectNumber = 5;
// 将上次选择的图片设置为本次预选图片
photoSelectOptions.preselectedUris = this.preSelected
let photoPicker = new photoAccessHelper.PhotoViewPicker();
photoPicker.select(photoSelectOptions).then((PhotoSelectResult: photoAccessHelper.PhotoSelectResult) => {
//select方法:在选择图片点击完成之后, PhotoSelectResult.photoUris 返回选中的uri,缓存到preSelected中
this.preSelected = PhotoSelectResult.photoUris
console.info('PhotoViewPicker.select successfully, PhotoSelectResult uri: ' + JSON.stringify(PhotoSelectResult));
}).catch((err: BusinessError) => {
console.error(`PhotoViewPicker.select failed with err: ${err.code}, ${err.message}`);
});
} catch (error) {
let err: BusinessError = error as BusinessError;
console.error(`PhotoViewPicker failed with err: ${err.code}, ${err.message}`);
}
}
运行效果:
如果preselectedUris中预选择的图片已被删除,select接口不会报异常,也不会影响未删除的图片被默认选中。比如上次选中了图1、图2、图3,从图库中删除图2后,进入图片选择页面,会默认选中图1和图3。
目前PhotoViewPicker不支持将预选择的图片集中显示在列表头部,如果上次选中的图片是分散的,再次进入默认选中的图片仍然是分散的。
作为IT专家,对于HarmonyOS鸿蒙Next系统中PhotoViewPicker组件的问题有所了解。针对你提到的“已选择图片再次进入未默认选中”的问题,这通常是由于图片的URI没有被正确保存和读取所导致的。
在HarmonyOS中,当你使用PhotoViewPicker选择图片后,你需要获取图片的URI,并将其保存在应用的持久化存储中,如preferences。确保在下次进入应用时,从持久化存储中读取这个URI,并使用Image组件来显示它。
然而,有开发者反馈在HarmonyOS鸿蒙Next系统中,通过PhotoViewPicker获取的图片URI在下次打开应用时可能无法正确显示图片。这可能是由于URI的权限问题或者图片存储路径的问题。
为了解决这个问题,你可以尝试以下步骤:
- 确保在保存URI时,使用的是持久化存储,如preferences,并且保存的路径和文件名是唯一的。
- 在读取URI时,检查URI的有效性,并确保它指向的图片仍然存在于设备的存储中。
- 如果可能的话,考虑将选中的图片上传到服务器,并在需要时从服务器下载,以避免设备存储路径的问题。
此外,由于PhotoViewPicker可能存在已知BUG,你也可以考虑使用MediaPickerAPI作为替代方案来实现图片选择功能。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html。