HarmonyOS 鸿蒙Next:从图库选择图片后复制至应用目录下失败

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

HarmonyOS 鸿蒙Next:从图库选择图片后复制至应用目录下失败

引入依赖:

"@pura/harmony-utils": "^1.0.2"

代码:

async callFilePickerSelectImage(): Promise<void> {
  let array: string[];
  try {
    let PhotoSelectOptions = new photoAccessHelper.PhotoSelectOptions();
    PhotoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE;
    PhotoSelectOptions.maxSelectNumber = 1;
    // Create a PhotoViewPicker object.
    let photoPicker = new photoAccessHelper.PhotoViewPicker();
    photoPicker.select(PhotoSelectOptions).then((PhotoSelectResult) => {
      Logger.info(TAG,
        'PhotoViewPicker.select successfully, PhotoSelectResult uri: ' + JSON.stringify(PhotoSelectResult));
      if (PhotoSelectResult !== null && PhotoSelectResult !== undefined) {
        // Declare variable array, whose value is the array in PhotoSelectResult.
        array = PhotoSelectResult['photoUris'];

        // 选择的图片 uri
        let originUri = array[0]
        let fileExtention = FileUtil.getFileExtention(originUri)
        let targetFileName = 'IMG_' + Date.now() + '.' + fileExtention
        // 目标图片保存的目录
        let imgSaveDir = FileUtil.getFilesDirPath('bottomRight')
        // 目标图片的路径
        let targetFilePath = FileUtil.getFilesDirPath(imgSaveDir, targetFileName)
        // 获取图片 uri 对应的文件 path
        let srcPath = FileUtil.getFilePath(originUri)
        LogUtil.debug(`===> srcPath is ${originUri} imgSaveDir is ${imgSaveDir} targetFilePath is ${targetFilePath}`)
        // 复制选择的图片到应用内部指定路径
        FileUtil.copyFileSync(srcPath, targetFilePath)
      }
    }).catch((err: BusinessError) => {
      console.log(err.stack)
      Logger.error(TAG, 'PhotoViewPicker.select failed with err: ' + JSON.stringify(err));
    });
  } catch (err) {
    Logger.error(TAG, 'PhotoViewPicker failed with err: ' + err);
  }
}

报错日志信息:

PhotoViewPicker.select failed with err: {"code":13900002}

官方文档错误码解释:

13900002 没有这个文件或目录
错误信息
No such file or directory

可能原因
文件或目录不存在。

处理步骤
确认文件路径是否存在。

https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/errorcode-filemanagement-V5#section13900002-%E6%B2%A1%E6%9C%89%E8%BF%99%E4%B8%AA%E6%96%87%E4%BB%B6%E6%88%96%E7%9B%AE%E5%BD%95

================= 更新 =================

目前已经解决了,解决方法如下:

// 需要先 open 这个 file,此处的 mode 值只能传入 fileIo.OpenMode.READ_ONLY & fileIo.OpenMode.WRITE_ONLY ,传入 READ_WRITE 是不行的,会报错
let file = fs.openSync(path, fileIo.OpenMode.READ_ONLY & fileIo.OpenMode.WRITE_ONLY)

// 然后,再进行文件的复制操作
fileIo.copyFileSync(file.fd, targetFilePath)

更多关于HarmonyOS 鸿蒙Next:从图库选择图片后复制至应用目录下失败的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

7 回复
// 需要先 open 这个 file,此处的 mode 值只能传入 fileIo.OpenMode.READ_ONLY & fileIo.OpenMode.WRITE_ONLY ,传入 fileIo.OpenMode.READ_WRITE 是不行的,会报错
let file = fs.openSync(path, fileIo.OpenMode.READ_ONLY & fileIo.OpenMode.WRITE_ONLY)

// 然后,再进行文件的复制操作
fileIo.copyFileSync(file.fd, targetFilePath)

更多关于HarmonyOS 鸿蒙Next:从图库选择图片后复制至应用目录下失败的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


这里传入的path是什么?photoPicker获取到的uri吗?我用这个方法,在复制的时候还是报错

  1. 使用 PhotoViewPicker 选择图片,该接口返回一个 PhotoSelectResult 对象,其中包含选中的图片的 URI。注意:返回的 URI 只能通过临时授权的方式调用 photoAccessHelper.getAssets 接口去使用。

  2. 使用临时授权的方式调用 photoAccessHelper.getAssets 接口,获取图片的资源信息。

找到解决方案了,放在评论区里了,

参考一下这个demo:

selectPhoto() { const photoSelectOptions = new picker.PhotoSelectOptions(); const photoViewPicker = new picker.PhotoViewPicker(); photoSelectOptions.MIMEType = picker.PhotoViewMIMETypes.IMAGE_TYPE; // 过滤选择媒体文件类型为IMAGE photoSelectOptions.maxSelectNumber = 1; // 选择媒体文件的最大数目 photoViewPicker.select(photoSelectOptions).then((photoSelectResult: picker.PhotoSelectResult) => { const fileUri = photoSelectResult.photoUris[0] this.getFileInfo(fileUri) }).catch((err: BusinessError) => { console.error(Invoke photoViewPicker.select failed, code is ${err.code}, message is ${err.message}); }) } async getFileInfo(filePathString: string) { try { let uri = fileUri.getUriFromPath(filePathString) let fileUriObject = new fileUri.FileUri(uri); let filename = fileUriObject.name let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(this.context); let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates(); // 配置查询条件,使用PhotoViewPicker选择图片返回的uri进行查询 predicates.equalTo(‘uri’, filePathString) let fetchOption: photoAccessHelper.FetchOptions = { fetchColumns: [], predicates: predicates }; let fetchResult: photoAccessHelper.FetchResult<photoAccessHelper.PhotoAsset> = await phAccessHelper.getAssets(fetchOption) // 得到uri对应的PhotoAsset对象,读取文件的部分信息 const asset: photoAccessHelper.PhotoAsset = await fetchResult.getFirstObject(); let logString = filename:${filename} fileSize:${asset.get(photoAccessHelper.PhotoKeys.SIZE)} console.log(logString) let resFile = fs.openSync(filePathString, fs.OpenMode.READ_ONLY) console.log(‘文件信息:’ + ‘fd:’ + resFile.fd + '; ’ + ‘path:’ + resFile.path + '; ’ + ‘name:’ + resFile.name); } catch (e) { console.error(e) } }

找到解决方案了,放在评论区里了,

针对帖子标题“HarmonyOS 鸿蒙Next:从图库选择图片后复制至应用目录下失败”的问题,可能的原因及解决方案如下:

可能原因:

  1. 权限问题:应用可能未获得读写存储的权限,或者权限申请流程存在问题。
  2. 路径问题:选择的图片路径可能不正确,或者应用目录的路径设置有误。
  3. 文件操作问题:在复制文件时可能遇到IO异常或其他文件操作错误。

解决方案:

  1. 检查并申请权限:确保应用已正确申请并获得了读写存储的权限。在鸿蒙系统中,需要在manifest文件中声明权限,并在运行时动态申请。
  2. 验证路径正确性:检查从图库选择的图片路径是否正确,以及应用目录下的目标路径是否可写。
  3. 异常处理:在复制文件时添加异常处理逻辑,捕获并处理可能发生的IO异常。

请注意,以上解决方案基于常见的开发经验和问题排查方法。如果问题依旧存在,可能是由于系统特性或特定环境下的其他问题导致。此时,建议直接联系鸿蒙系统的开发者支持或参考官方文档进行深入排查。

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

回到顶部