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

    文章

    4077

    浏览量

    136627
  • 鸿蒙系统
    +关注

    关注

    183

    文章

    2649

    浏览量

    71327
  • HarmonyOS
    +关注

    关注

    80

    文章

    2195

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    圣邦微电子推新车规级降压芯片,宽电压大电流一招搞定

    圣邦微电子最近推出了款新的车规级降压转换器SGM61606-ADJQ,支持4V60V的超宽输入电压范围,能稳定输出600mA电流,专门为汽车电子这类供电环境复杂、可靠性要求高的场景设计。
    的头像 发表于 08-06 09:42 516次阅读

    HarmonyOS Agent Skills正式开源

    HarmonyOS 近日在 GitCode 平台开源 HarmonyOS_Skills 代码仓库,正式推出首批 HarmonyOS Agent Skills。
    的头像 发表于 06-16 10:40 442次阅读

    汽车阀门漏气难排查?这款检测仪一招搞定

    在汽配生产和质检过程中,很多厂家都遇到过同个难题:汽车阀门漏气难以排查。汽车阀门作为制动、燃油、进气系统的核心配件,密封性直接决定整车的安全性能。但传统检测方式弊端明显,细微漏点肉眼看不见、人工
    的头像 发表于 06-08 16:18 220次阅读
    汽车阀门漏气难排查?这款检测仪<b class='flag-5'>一招</b><b class='flag-5'>搞定</b>

    实战 | 睿擎平台 zlib: 嵌入式数据压缩方案,从移植应用文打通

    、维护难。今天分享个基于睿擎派RC3506的完整zlib方案——从源码移植应用实战,提供两种压缩方式,手把手带你搞定嵌入式数据压缩。为什么选zlib?zlib是全
    的头像 发表于 05-20 18:29 993次阅读
    <b class='flag-5'>实战</b> | 睿擎平台 zlib: 嵌入式数据压缩方案,从移植<b class='flag-5'>到</b>应用<b class='flag-5'>一</b>文打通

    电表远距高采低补失效?易控宝空载直补一招搞定

    远距高供高计导致力调罚款,空载直补技术精准补偿,提升功率因数,有效降低罚款。
    的头像 发表于 04-11 12:57 354次阅读
    电表远距高采低补失效?易控宝空载直补<b class='flag-5'>一招</b><b class='flag-5'>搞定</b>

    变压器空载无功+负载无功:易控宝空载直补一招搞定

    企业力调电费罚款源于无功补偿不足,主要来自变压器空载无功和设备负载无功,需分清两部分进行补偿,才能彻底解决罚款问题。
    的头像 发表于 03-24 12:39 669次阅读
    变压器空载无功+负载无功:易控宝空载直补<b class='flag-5'>一招</b><b class='flag-5'>搞定</b>

    IT 补丁管理的8大深坑,一招全破解

    很多IT团队一到每月的“补丁星期二”就头疼,设备多、远程管不过来、补丁总漏打、怕更崩系统、审计要的材料拿不出来。对企业来说,补丁管理绝不仅仅是看到更新提示点下“立即更新”那么简单,而是套关乎终端
    的头像 发表于 03-19 17:05 1140次阅读
    IT 补丁管理的8大深坑,<b class='flag-5'>一招</b>全破解

    钉钉正式开源HarmonyOS图片编辑组件

    近日,由钉钉团队自主研发的“HarmonyOS图片编辑组件”正式上线OpenHarmony三方库中心仓并开源。作为款填补鸿蒙社区图像处理领域空白的重量级组件,该方案基于HarmonyOS
    的头像 发表于 01-05 09:58 1023次阅读

    从EMI超标轻松过检,沃尔德软桥为何成为工程师新宠?

    在电源设计领域,你是否经常遇到EMI问题的挑战?传统的整流桥在关断时产生的震荡不仅影响了效率,还增加了EMI抑制元件的成本。沃尔德半导体推出的软桥系列,一招搞定难题!今天,我将带你深入了解这款革命性产品的核心优势及其应用领域
    的头像 发表于 12-24 17:50 973次阅读
    从EMI超标<b class='flag-5'>到</b>轻松过检,沃尔德软桥为何成为工程师新宠?

    智能楼宇改造避坑指南:别再换掉所有老设备!一招搞定ETHERNET/IP转DEVICENET的共存难题

    智能楼宇改造避坑指南:别再换掉所有老设备!一招搞定ETHERNET/IP转DEVICENET的共存难题 1. 项目背景:老旧楼宇的智能化挑战 在现代智能楼宇控制系统中,我们常面临新旧设备混合的复杂
    的头像 发表于 12-17 15:35 626次阅读
    智能楼宇改造避坑指南:别再换掉所有老设备!<b class='flag-5'>一招</b><b class='flag-5'>搞定</b>ETHERNET/IP转DEVICENET的共存难题

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

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

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

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

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

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

    【直播预告】10月29日 周三 晚8点 |睿擎网络开发实战:从配置应用,掌握工业级网络开发精髓!| 直播预告

    从网络配置远程控制,次直播全搞定!在工业物联网和边缘计算项目中,稳定可靠的网络功能是系统成功的关键。然而,在实际开发中,网络配置复杂、协议选择困难、远程控制实现难度大等问题常常困扰着开发者。为此
    的头像 发表于 10-28 17:19 1551次阅读
    【直播预告】10月29日 周三 晚8点 |睿擎网络开发<b class='flag-5'>实战</b>:从配置<b class='flag-5'>到</b>应用,掌握工业级网络开发精髓!| 直播预告

    【直播预告】周三晚8点|睿擎网络开发实战:从配置应用,掌握工业级网络开发精髓!| 直播预告

    从网络配置远程控制,次直播全搞定!在工业物联网和边缘计算项目中,稳定可靠的网络功能是系统成功的关键。然而,在实际开发中,网络配置复杂、协议选择困难、远程控制实现难度大等问题常常困扰着开发者。为此
    的头像 发表于 10-25 10:05 1268次阅读
    【直播预告】周三晚8点|睿擎网络开发<b class='flag-5'>实战</b>:从配置<b class='flag-5'>到</b>应用,掌握工业级网络开发精髓!| 直播预告