0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

HarmonyOS实战:一招搞定保存图片到相册

尤枫 来源:jf_54996641 2025-06-24 17:04 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

前言

保存图片功能几乎是每个应用程序必备的功能之一,当用户遇到喜欢的图片时可以保存到手机相册。那么在鸿蒙中保存图片是否也需要申请用户存储权限以及如何将图片保存到相册,本文将详细讲述怎么保存网络图片,指定布局生成图片保存至相册的功能实现。

实现效果

需求分析

一般在 AndroidiOS 上保存图片都需要申请应用存储权限,否则将禁止访问应用存储,不能保存图片到磁盘中。在鸿蒙系统中当然也有存储权限,但是鸿蒙系统对于权限管理十分严格,一般情况下,禁止用户申请访问存储权限。但是提供了系统级别的安全控件,不需要用户手动申请权限,用于存储的直接访问。

  1. 可以使用系统提供的安全控件实现权限的直接访问。
  2. 同时也提供申请权限方式进行存储权限的访问。
  3. 使用网络请求将图片转成流,然后保存成图片。

技术实现

申请权限方式

  1. 权限申请
const permissions: Array< Permissions > = [
  'ohos.permission.WRITE_IMAGEVIDEO'
];
const context = getContext(this) as common.UIAbilityContext;
const atManager = abilityAccessCtrl.createAtManager();
await atManager.requestPermissionsFromUser(context, permissions);
  1. 权限判断
PermissionUtil.checkAccessToken(permissions[0]).then((status)= >{
            if (status == abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) {
              FileSaveManager.getPicture(this.imagePath)
            }else{
              PermissionUtil.openPermissionsInSystemSettings(getContext(this) as common.UIAbilityContext)
            }
   })

安全控件方式

SaveButton({ text: SaveDescription.SAVE_IMAGE, buttonType: ButtonType.Normal })
           .fontColor(Color.White)
           .fontWeight(FontWeight.Medium)
           .onClick(async (event: ClickEvent, result: SaveButtonOnClickResult) = > {
             if (result == SaveButtonOnClickResult.SUCCESS) {
               try {
                 this.saveImage()
               } catch (error) {
                 console.error("error is " + JSON.stringify(error));
               }
             }
           })

可以看出通过系统安全控件 SaveButton 可以临时访问系统存储,不需要申请任何权限。更好的保护用户隐私安全,这也是鸿蒙官方提倡使用的方式。

网络图片保存

  1. 下载图片,并将数据转化为 ArrayBuffer 类型。
/**
   * 通过http的request方法从网络下载图片资源
   */
  static async getPicture(url:string) {
    http.createHttp()
      .request(url,
        (error: Error, data: http.HttpResponse) = > {
          if (error) {
            showShortCenterToast("图片保存失败")
            return;
          }
          // 判断网络获取到的资源是否为ArrayBuffer类型
          if (data.result instanceof ArrayBuffer) {
            FileSaveManager.saveImageToPhoto(data.result as ArrayBuffer)
          }
        }
      )
  }
  1. 保存图片到相册
/**
   * 保存ArrayBuffer到图库
   * @param buffer:图片ArrayBuffer
   * @returns
   */
  static async saveImageToPhoto(buffer: ArrayBuffer | string): Promise< void > {
    const context = getContext() as common.UIAbilityContext; // 获取getPhotoAccessHelper需要的context
    const helper = photoAccessHelper.getPhotoAccessHelper(context); // 获取相册管理模块的实例
    const uri = await helper.createAsset(photoAccessHelper.PhotoType.IMAGE, 'jpg'); // 指定待创建的文件类型、后缀和创建选项,创建图片或视频资源
    const file = await fs.open(uri, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
    let r =  await fs.write(file.fd, buffer);
    await fs.close(file.fd);
    showShortCenterToast("图片保存成功")
  }

指定布局保存

在 Android 或 iOS 中,经常会遇到需要保存指定样式的布 View 为图片。Android 中则需要使用 View 的绘制,将布局绘制出来后,再进行保存。但是在鸿蒙中实现起来就比较简单。

** 1. 将需要保存的 View 布局指定 Id。**

Column() {
    //布局样式
  } 
.id("root")
  1. 通过 id 将 View 保存成图片。
componentSnapshot.get("photo", (error: Error, pixmap: image.PixelMap) = > {
                  if (error) {
                    console.log("error: " + JSON.stringify(error))
                    return;
                  }
                  const  packOpts : image.PackingOption = { format:"image/jpeg", quality:98 };
                  imagePackerApi.packing(pixmap, packOpts).then( async (data : ArrayBuffer) = > {
                    FileSaveManager.saveImageToPhoto(data)
                  }).catch((error : BusinessError) = > {
                    console.error('Failed to pack the image. And the error is: ' + error);
                  })
                })

总结

对比 Android 或 iOS 来说,鸿蒙在实现功能上相对简单,比较容易上手。但是鸿蒙对于用户权限的获取要求比较严格,正式上线一般都需要使用系统提供的安全组件访问应用程序的相册或存储,日常开发中需要十分注意,以免影响项目的正常上线。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Android
    +关注

    关注

    12

    文章

    3985

    浏览量

    133046
  • 鸿蒙系统
    +关注

    关注

    183

    文章

    2642

    浏览量

    69337
  • HarmonyOS
    +关注

    关注

    80

    文章

    2146

    浏览量

    35567
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    电子产品散热难题?Flotherm软件一招搞定

    ——Flotherm! Flotherm 是款专业极致的电子系统散热仿真软件,在行业内堪称 “扛把子”。它就像是位拥有超能力的虚拟工程师,利用先进的计算流体动力学(CFD)技术,结合数值传热学方法,能够精准预测电子设备在
    的头像 发表于 11-06 16:52 426次阅读
    电子产品散热难题?Flotherm软件<b class='flag-5'>一招</b><b class='flag-5'>搞定</b>!

    基于开源鸿蒙的图片编辑开发样例(1)

    本期内容介绍基于开源鸿蒙在RK3568上开发图片编辑样例的全流程,分为上篇和下篇,本篇为上篇,主要介绍添加相册图片、编译图片功能。
    的头像 发表于 10-31 09:16 2761次阅读
    基于开源鸿蒙的<b class='flag-5'>图片</b>编辑开发样例(1)

    工业电路总出问题?槟城BMG10D系列压敏复合器件:一招解决过压难题

    ”。工业电路总出问题?槟城BMG10D系列压敏复合器件:一招解决过压难题。它从根源上保证了品质——原厂技术支持、稳定供货,不用担心中间环节出岔子,买得放心,用得也踏
    的头像 发表于 09-05 16:58 454次阅读
    工业电路总出问题?槟城BMG10D系列压敏复合器件:<b class='flag-5'>一招</b>解决过压难题

    10个RTL优化实战技巧

    今天我给大家总结10个实战级优化技巧,每条都有具体案例,助你从根源上搞定资源问题!
    的头像 发表于 07-21 15:01 642次阅读

    HarmonyOS 5】鸿蒙应用实现发票扫描、文档扫描输出PDF图片或者表格的功能

    HarmonyOS 5】鸿蒙应用实现发票扫描、文档扫描输出PDF图片或者表格的功能 ##鸿蒙开发能力 ##HarmonyOS SDK应用服务##鸿蒙金融类应用 (金融理财# 、前言
    的头像 发表于 07-11 18:16 865次阅读
    【<b class='flag-5'>HarmonyOS</b> 5】鸿蒙应用实现发票扫描、文档扫描输出PDF<b class='flag-5'>图片</b>或者表格的功能

    如何实现组件截图 -- componentSnapshot

    等,文字和图片都是根据用户信息动态生成的,整个证书在显示的时候是通过Stack组件去完成的,如果只是在程序里显示那么当然很简单,但是还需要将其作为图片保存
    发表于 06-30 17:45

    ##DevEco Studio##如何让模拟器里有图片?【图片下载法】

    ​ API9和API12在模拟器上,有个巨大的区别,那就是API9(开发工具3的版本),他的模拟器里有个拍照功能(再往前的版本里甚至还有浏览器,可以通过浏览器下载图片),可以通过拍照功能让
    发表于 06-29 22:51

    harmony-utils之PickerUtil,拍照、文件选择和保存,工具类

    harmony-utils之PickerUtil,拍照、文件选择和保存,工具类 harmony-utils 简介与说明 harmony-utils 款功能丰富且极易上手的HarmonyOS工具库
    的头像 发表于 06-27 16:03 353次阅读

    HarmonyOS实战一招解决等待多个并发结果

    前言 年前公司与华为签订了合作备忘录,加入了鸿蒙生态这个大家庭。。公司想赶着鸿蒙纯血系统上市之前,发布自己的鸿蒙软件。开发鸿蒙NEXT版本软件就变成了今年的个工作重心。 ** 本文主要
    的头像 发表于 06-09 14:57 400次阅读
    <b class='flag-5'>HarmonyOS</b><b class='flag-5'>实战</b>:<b class='flag-5'>一招</b>解决等待多个并发结果

    鸿蒙5开发宝藏案例分享---多开发实例(图片美化)

    ?【鸿蒙开发宝藏案例分享】搞定多端适配的图片美化应用开发思路!? Hey小伙伴们~ 今天在翻鸿蒙文档时挖到个超实用的大宝藏!原来官方早就悄悄提供了超多\"
    发表于 06-03 16:09

    移动电源EMC整改:认证失败次通过的实战经验

    深圳南柯电子|移动电源EMC整改:认证失败次通过的实战经验
    的头像 发表于 05-26 11:25 569次阅读
    移动电源EMC整改:认证失败<b class='flag-5'>到</b><b class='flag-5'>一</b>次通过的<b class='flag-5'>实战</b>经验

    鸿蒙开发实现图片上传(上传用户头像)

    应用场景: 选择图片 1.1. 添加图片相册中 默认的相册中无法添加图片:windows 模拟
    发表于 05-24 23:09

    基于STM32F103RC的电子相册(原理图、PCB源文件、程序源码及制作)

    基于STM32F103RC的电子相册(原理图、PCB源文件、程序源码及制作) 项目示例下载! 纯分享帖,需要者可点击附件免费获取完整资料~~~【免责声明】本文系网络转载,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请第
    发表于 05-23 20:40

    一招治“浮”! 高精度3D线激光轮廓测量仪保障螺丝装配

    浮高产生的系列问题,都将对机器的安全运行埋下隐患。 各类因素产生的螺丝浮高 GL-8000系列 为您一招治“浮” 螺丝浮高检测案例 01 检测需求 1.次性扫描检测4个螺丝的高度差 2.精度要求0.03-0.05mm 3.速
    的头像 发表于 02-06 18:15 903次阅读
    <b class='flag-5'>一招</b>治“浮”! 高精度3D线激光轮廓测量仪保障螺丝装配

    存储空间告急?NAS扩容一招搞定,轻松无忧!

    和vlog …… 这些点点滴滴 都是我们共同走过2024年的珍贵凭证 当硬盘的进度条渐渐变红 仿佛在向我们展示这年来满满的收获 但存储空间紧急告急怎么办? NAS扩容一招搞定 、阵
    的头像 发表于 12-24 16:35 1149次阅读
    存储空间告急?NAS扩容<b class='flag-5'>一招</b><b class='flag-5'>搞定</b>,轻松无忧!