鸿蒙 next 系统使用 uni-app saveImageToPhotosAlbum 报错 无法保存

鸿蒙 next 系统使用 uni-app saveImageToPhotosAlbum 报错 无法保存

开发环境 版本号 项目创建方式
Mac 15.5 HBuilderX

产品分类:uniapp/App

PC开发环境操作系统:Mac

HBuilderX类型:Alpha

HBuilderX版本号:4.86

手机系统:HarmonyOS NEXT

手机系统版本号:HarmonyOS 5.1.0

手机厂商:华为

手机机型:MatePad 11.5S

页面类型:vue

vue版本:vue3

打包方式:离线

项目创建方式:HBuilderX

示例代码:

ctx.draw(false, () => {  
  // #ifdef  APP-HARMONY  
  console.log('HARMONY 平台 - Canvas 绘制完成,开始转换为临时文件')  
  // #endif  
 uni.canvasToTempFilePath({  
    canvasId,  
    width: imageSize,  
    height: imageSize,  
    destWidth: imageSize,  
    destHeight: imageSize,  
    success: (res) => {  
      // #ifdef  APP-HARMONY  
      console.log('HARMONY 平台 - 临时文件生成成功,路径:', res)  
      console.log(typeof res)  

      const tempFilePath = res.tempFilePath   

      // #endif  
      uni.saveImageToPhotosAlbum({  
        filePath: tempFilePath,  
        success: (res) => {  
          // #ifdef  APP-HARMONY  
          console.log(`HARMONY 平台 - 保存到相册成功${res}`)  
          // #endif  
          uni.showToast({ title: '已保存到相册', icon: 'success' })  
        },  
        fail: (err) => {  
          // #ifdef  APP-HARMONY  
          console.error('HARMONY 平台 - 保存到相册失败:', JSON.stringify(err))  
          // #endif  
        },  
      })  
    },  
    fail: (err) => {  
      // #ifdef  APP-HARMONY  
      console.error('HARMONY 平台 - 图片转换失败:', JSON.stringify(err))  
      // #endif  
      uni.showToast({ title: '图片转换失败', icon: 'none' })  
    },  
  })  
})
`

更多关于鸿蒙 next 系统使用 uni-app saveImageToPhotosAlbum 报错 无法保存的实战教程也可以访问 https://www.itying.com/category-93-b0.html

10 回复

提供一个可直接运行的代码。

更多关于鸿蒙 next 系统使用 uni-app saveImageToPhotosAlbum 报错 无法保存的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


直接调用方法uni.saveImageToPhotosAlbum可以测试

无论是从网络下还是临时文件保存都报以上错误

因为你不提供可直接运行的代码,提到网络下载之后进行保存是报错的。我使用 HBuilderX 4.86alpha 运行到鸿蒙表现正常
<template>
<view>
<button @click=“save1”>saveImage</button>
</view>
</template>

<script setup> const save1 = () => { console.log('save1 tap!'); uni.downloadFile({ url: 'https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/logo.png', success(res) { console.log('download', res.tempFilePath); const file = res.tempFilePath uni.saveImageToPhotosAlbum({ filePath: file, success: function() { console.log('save success'); } }); } }) } </script>

点击按钮,会正常出现保存图片的弹窗提示。你可根据我的代码进行修改,说明你的问题

使用你提供代码测试还是报错,我添加调用失败的方法,出现了以下报错信息 11:17:21.517 ERR_FILE_NOT_FOUND 11:17:22.654 save1 tap! at pages/test/test.vue:17 11:17:22.781 download /data/storage/el2/base/cache/UNI0xxxx6/uni-download/logo(8).png at pages/test/test.vue:21 11:17:22.802 photoAccessHelper getPhotoAccessHelper inner add createDeleteRequest and showAssetsCreationDialog 11:17:22.802 photoAccessHelper bundleName is com.xxxxx.avatar. 11:17:22.804 photoAccessHelper appId is com.xxxxx.avatar_BJ+xxhNida+21vvd0zp5H6fNTFC2U9NrynanPYirX46Z4v/Enpz6+lUvlcJIdyRA4FVGULKTl4ceesjpumCxtf8=. 11:17:22.804 photoAccessHelper labelId is com.xxxxx.avatar_BJ+xxhNida+21vvd0zp5H6fNTFC2U9NrynanPYirX46Z4v/Enpz6+lUvlcJIdyRA4FVGULKTl4ceesjpumCxtf8=. 11:17:22.808 photoAccessHelper modeleName is . 11:17:22.810 save fail {errMsg: “saveImageToPhotosAlbum:fail Invalid input parameter.”} at pages/test/test.vue:30

补充,我使用unibest来构建项目的

回复 7***@qq.com: 为了高效定位你的问题,请提供复现工程。你可测试新建工程加我的代码来验证功能是否正常。

回复 DCloud_UNI_OttoJi: 感谢你的回复,已经解决了,harmony-configs 配置的问题

回复 7***@qq.com: 好的,后续可尽可能提供复现工程。

在鸿蒙Next系统上,saveImageToPhotosAlbum 接口报错主要涉及权限和路径适配问题。根据你的代码和开发环境,建议排查以下几点:

  1. 权限配置:鸿蒙Next对存储权限管理严格,确保在 manifest.json 中已声明相册写入权限:

    "permissions": {
      "ohos.permission.WRITE_IMAGEVIDEO"
    }
    

    同时需在应用首次运行时动态申请权限。

  2. 路径格式兼容性:鸿蒙Next的文件路径处理可能与Android不同,确认 tempFilePath 为合法路径。建议在调用前检查路径是否存在:

    // 添加路径验证
    if (!tempFilePath || !tempFilePath.startsWith('file://')) {
      console.error('无效的临时文件路径');
      return;
    }
    
  3. API异步时序:鸿蒙Next的API调用可能存在时序要求,确保 canvasToTempFilePath 完全执行后再调用保存:

    uni.canvasToTempFilePath({
      // ... 参数
      complete: () => {
        // 确保转换完成后再保存
      }
    })
    
  4. 系统兼容处理:鸿蒙Next尚处于适配阶段,部分API可能存在兼容问题。可尝试使用 uni.downloadFile 作为备选方案:

    uni.downloadFile({
      url: tempFilePath,
      success: (res) => {
        if (res.statusCode === 200) {
          uni.saveImageToPhotosAlbum({
            filePath: res.tempFilePath
          })
        }
      }
    })
回到顶部