HarmonyOS 鸿蒙Next 从相册选择图片后通过预览打开失败

发布于 1周前 作者 vueper 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 从相册选择图片后通过预览打开失败

从相册选择图片后通过预览打开,预览失败了

3 回复

uri:file://com.example.myapplication/data/storage/el2/base/haps/entry/files/xxx.jpg

demo参考:

import { filePreview } from '@kit.PreviewKit';

import { promptAction } from '@kit.ArkUI';

import fs from '@ohos.file.fs';

import photoAccessHelper from '@ohos.file.photoAccessHelper';

import fileUri from '@ohos.file.fileuri';

let fileName: string = 'tt.jpg';

let context = getContext(this);

let fileDir = context.filesDir; // 获取沙箱路径

let uri = ''; // 获取uri

let pathDir = getContext().filesDir;

@Entry

@Component

struct Index {

  @State message: string = 'Hello World';

  build() {

    Row() {

      Column() {

        Button('1、相册图片写入沙箱')

          .onClick(() => {

            this.picture()

          })

        Button('2、预览')

          .onClick(async () => {

            let result = await filePreview.canPreview(context, uri); // 传入uri,判断是否可预览

            console.log('result:' + result)

            if (result) {

              let previewInfo: filePreview.PreviewInfo = {

                title: fileName,

                uri: uri,

                mimeType: 'image/jpeg'

              }

              filePreview.openPreview(getContext(this), previewInfo)

                .then(() => {

                  console.log('预览成功')

                }); // 打开预览

            } else {

              promptAction.showToast({

                // 不可预览

                message: '文件不可预览'

              });

            }

          })

      }

      .width('100%')

    }

    .height('100%')

  }

  async picture() {

    let PhotoSelectOptions = new photoAccessHelper.PhotoSelectOptions();

    PhotoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE;

    PhotoSelectOptions.maxSelectNumber = 1;

    let photoPicker = new photoAccessHelper.PhotoViewPicker();

    photoPicker.select(PhotoSelectOptions).then((PhotoSelectResult: photoAccessHelper.PhotoSelectResult) => {

      let photouri: Array<string> = PhotoSelectResult.photoUris

      console.log('photouri[0]:' + photouri[0])

      let file = fs.openSync(photouri[0], fs.OpenMode.READ_ONLY)

      //图片保存到沙箱

      uri = fileUri.getUriFromPath(pathDir + '/picture2.jpg')

      console.log('uri:'+uri)

      let file2 = fs.openSync(pathDir + '/picture2.jpg', fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE)

      fs.copyFileSync(file.fd, file2.fd)

      fs.closeSync(file);

      fs.closeSync(file2);

    })

  }

}

更多关于HarmonyOS 鸿蒙Next 从相册选择图片后通过预览打开失败的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


你好。

通过PhotoPicker,安全相册控件,从媒体资源库选择图片,点击完成后,会得到图片的Uri。

通过uri可以临时授权访问用户的相册图片。但是当app切入后台再返回前台就会丢失Uri的访问权限。

这里需要注意。如果是自己做的预览图片,会有这个问题。picker选择图片后的默认预览,不存在该问题。

针对HarmonyOS 鸿蒙Next系统中从相册选择图片后通过预览打开失败的问题,这通常与权限管理、图片路径处理或UI组件的绑定有关。以下是一些可能的解决方案概述,不涉及Java或C语言:

  1. 权限检查:确保应用已正确申请并获取了访问相册和存储的权限。在鸿蒙系统中,权限管理更为严格,未授权可能导致无法读取图片。

  2. 图片路径处理:检查从相册获取的图片路径是否正确,以及路径格式是否适用于鸿蒙系统的文件访问API。有时路径错误或格式不兼容会导致预览失败。

  3. UI组件绑定:确认图片预览组件已正确绑定到图片数据源。在鸿蒙的UI框架中,数据绑定错误或未及时更新可能导致组件无法显示内容。

  4. 异常捕获:增加异常捕获逻辑,查看是否有具体的错误信息或异常抛出,这有助于定位问题。

  5. 系统兼容性:考虑是否是由于鸿蒙系统版本更新导致的兼容性问题,尝试在不同版本的鸿蒙系统上测试。

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

回到顶部