HarmonyOS 鸿蒙Next中使用uniapp适配时遇到保存图片的相关问题

HarmonyOS 鸿蒙Next中使用uniapp适配时遇到保存图片的相关问题 【问题描述】:

使用uniapp适配鸿蒙的时候,遇到一个保存图片的相关问题

该权限已申请:ohos.permission.WRITE_IMAGEVIDEO,提示保存

【问题现象】:

cke_3329.jpeg

cke_3681.jpeg

【版本信息】:hbuilder 4.76 DevEco Studio 5.1.1 Release

【复现代码】:无


更多关于HarmonyOS 鸿蒙Next中使用uniapp适配时遇到保存图片的相关问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

建议通过uni方法上传下载保存到相册,无需申请权限,参考文档如下。

【背景知识】

  • uni.chooseImage:从本地选择图片。
  • uni.uploadFile:上传文件到服务器。
  • uni.downloadFile:下载文件资源到本地,返回文件的本地临时路径。
    • 直接调用可能会出现文件名、文件拓展名缺失的情况,需要传入filePath参数,自行指定文件保存的本地路径。
    • 获取沙箱目录下的缓存目录一般是通过uts插件通过HarmonOS侧的context获取。如果不想调用uts插件,应用可以访问的沙箱目录的cacheDir,目前路径是/data/storage/el2/base/haps/entry/cache。
  • uni.saveImageToPhotosAlbum:将本地图片保存到相册。

【解决方案】

上传图片到服务器: uni-app中可以调用uni.chooseImage选择图片,再调用uni.uploadFile将选择的图片上传到服务器。

保存网络图片到相册: uni-app中保存网络图片到相册中,可以先调用uni.downloadFile将网络图片保存到指定沙箱目录下,再通过uni.saveImageToPhotosAlbum保存到相册中。

示例代码:

<template>
  <view class="content">
    <button type="default" @click="uploadImage">选择图片上传服务器</button>
    <button type="default" @click="downloadImage">下载图片保存到相册</button>
  </view>
</template>

<script>
  export default {
    data() {
      return {

      }
    },
    onLoad() {

    },
    methods: {
      uploadImage() {
        // 从本地选择图片文件
        uni.chooseImage({
          success: (chooseImageRes) => {
            const tempFilePaths = chooseImageRes.tempFilePaths;
            // 上传图片文件
            const uploadTask = uni.uploadFile({
              url: 'https://www.example.com/upload',
              filePath: tempFilePaths[0],
              name: 'file',
              success: (uploadFileRes) => {
                console.info(`上传完成`);
              }
            });

            uploadTask.onProgressUpdate((res) => {
              console.info(`上传进度:${res.progress}`);
            });
          }
        });
      },
      downloadImage() {
        uni.downloadFile({
          // 这里传入网络图片的链接
          url: "https://www-file.huawei.com/admin/asset/v1/pro/view/5deaae05e9714a84bce397e965853aae.jpg",
          success: (res) => {
            uni.saveImageToPhotosAlbum({
              filePath: res.tempFilePath,
              success: (data) => {
                if (data) {
                  uni.showToast({
                    title: `保存图片到相册成功 path: ${data.path}`
                  })
                }
              },
              fail: (err) => {
                console.error('保存失败:', err)
              }
            })
          },
          fail: (error) => {
            console.error('下载失败:', error)
          }
        })
      }
    }
  }
</script>

<style>
  .content {
    display: flex;
    flex-direction: column;
  }

  .content button {
    margin-bottom: 32rpx;
    width: 100%;
  }
</style>

更多关于HarmonyOS 鸿蒙Next中使用uniapp适配时遇到保存图片的相关问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


该问题已解决;之前一直用的是DevEco提供的模拟器测试的出现问题,用真机测的话就没问题了,

在HarmonyOS Next中,使用uni-app保存图片时需调用系统相册权限与媒体库接口。通过@ohos.file.picker选择保存位置,使用@ohos.multimedia.mediaLibrary写入图片数据。注意适配鸿蒙文件路径格式,使用PhotoViewPicker完成保存操作。需在module.json5中声明ohos.permission.READ_IMAGEVIDEOohos.permission.WRITE_IMAGEVIDEO权限。

在HarmonyOS Next中使用uniApp适配保存图片功能时,权限申请正确(ohos.permission.WRITE_IMAGEVIDEO),但保存失败通常与路径处理或API调用方式有关。以下是关键排查点:

  1. 检查保存路径格式:确保路径符合HarmonyOS文件管理规范,使用正确的沙箱路径(如context.filesDircontext.cacheDir),避免直接使用外部存储路径。

  2. 验证图片数据源:确认图片数据是否有效且可访问。如果是网络图片,需先下载到本地;如果是base64数据,需正确解码。

  3. 使用鸿蒙原生API:uniApp可能未完全封装鸿蒙的图片保存接口。尝试通过uni.requireNativePlugin调用鸿蒙的@ohos.multimedia.image库的image.createImagePacker()imagePack.save()方法。

  4. 调试权限实际生效情况:在module.json5中声明权限后,需动态检查权限状态(使用abilityAccessCtrl相关API),确保运行时已授权。

  5. 查看日志详情:通过DevEco Studio的Log窗口过滤错误日志,定位具体异常堆栈,常见问题包括路径无写入权限或文件已存在。

建议提供保存操作的核心代码段,以便进一步分析是路径构造、数据转换还是API兼容性问题导致。

回到顶部