HarmonyOS 鸿蒙Next 如何解决PhotoViewPicker已选择图片再次进入未默认选中的问题

发布于 1周前 作者 zlyuanteng 最后一次编辑是 5天前 来自 鸿蒙OS

【问题现象】

通过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不支持将预选择的图片集中显示在列表头部,如果上次选中的图片是分散的,再次进入默认选中的图片仍然是分散的。

1 回复

作为IT专家,对于HarmonyOS鸿蒙Next系统中PhotoViewPicker组件的问题有所了解。针对你提到的“已选择图片再次进入未默认选中”的问题,这通常是由于图片的URI没有被正确保存和读取所导致的。

在HarmonyOS中,当你使用PhotoViewPicker选择图片后,你需要获取图片的URI,并将其保存在应用的持久化存储中,如preferences。确保在下次进入应用时,从持久化存储中读取这个URI,并使用Image组件来显示它。

然而,有开发者反馈在HarmonyOS鸿蒙Next系统中,通过PhotoViewPicker获取的图片URI在下次打开应用时可能无法正确显示图片。这可能是由于URI的权限问题或者图片存储路径的问题。

为了解决这个问题,你可以尝试以下步骤:

  1. 确保在保存URI时,使用的是持久化存储,如preferences,并且保存的路径和文件名是唯一的。
  2. 在读取URI时,检查URI的有效性,并确保它指向的图片仍然存在于设备的存储中。
  3. 如果可能的话,考虑将选中的图片上传到服务器,并在需要时从服务器下载,以避免设备存储路径的问题。

此外,由于PhotoViewPicker可能存在已知BUG,你也可以考虑使用MediaPickerAPI作为替代方案来实现图片选择功能。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html。

回到顶部