鸿蒙 如何将base64的图片保存到相册

news/2024/6/24 20:19:23

把一个base64图片 保存到鸿蒙手机 相册中怎么实现呢?

下面有2中方法

方案一:可以通过安全控件「保存控件(SaveButton)」实现。该控件对应媒体库写入特权。应用集成保存控件后,用户点击该控件,应用会获取10秒内单次访问媒体库特权接口的授权。

参考代码:

import { photoAccessHelper } from '@kit.MediaLibraryKit';
import fs from '@ohos.file.fs';
import { http } from '@kit.NetworkKit';
import { promptAction } from '@kit.ArkUI';

/** * 参考资料: * https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/photoaccesshelper-resource-guidelines-0000001774280306-V5#ZH-CN_TOPIC_0000001881258417__使用安全控件创建媒体资源 */
@Entry
@Component
struct Index {
  @State message: string = 'Hello World'
  @State saveButtonOptions: SaveButtonOptions = {
    icon: SaveIconStyle.FULL_FILLED,
    text: SaveDescription.SAVE_IMAGE,
    buttonType: ButtonType.Capsule
  }

  // 设置安全控件按钮属性
  build() {
    Row() {
      Column() {
        Text(this.message).fontSize(50).fontWeight(FontWeight.Bold)
        SaveButton(this.saveButtonOptions)// 创建安全控件按钮
          .onClick(async (event, result: SaveButtonOnClickResult) => {
            if (result == SaveButtonOnClickResult.SUCCESS) {
              let context = getContext();
              //获取相册管理模块的实例,用于访问和修改相册中的媒体文件 let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context); 
              // onClick触发后10秒内通过createAsset接口创建图片文件,10秒后createAsset权限收回
              let uri = await phAccessHelper.createAsset(photoAccessHelper.PhotoType.IMAGE, 'jpg');
              // 创建媒体文件
              console.info('createAsset successfully, uri: ' + uri);
              let file = fs.openSync(uri, fs.OpenMode.READ_WRITE || fs.OpenMode.CREATE);
              let totalSize = 0;
              let httpRequest = http.createHttp();
              httpRequest.on("dataReceive", (data: ArrayBuffer) => {
                let writeLen = fs.writeSync(file.fd, data);
                totalSize = totalSize + writeLen;
              });
              httpRequest.requestInStream('https://developer.huawei.com/allianceCmsResource/resource/HUAWEI_Developer_VUE/images/homeNew/next- pc.png',
                { method: http.RequestMethod.GET, connectTimeout: 3000, }, httpCode => {
                  console.info('requestInStream HTTP CODE is', httpCode)
                })
              httpRequest.on("dataEnd", () => {
                fs.close(file);
                promptAction.showDialog({ title: "下载图片结束,并保存至相册", message: `图片大小:${totalSize}字节` })
              })
            } else {
              console.error('SaveButtonOnClickResult create asset failed');
            }
          })
      }
      .width('100%')
    }
    .height('100%')
  }
}

方案二:通过申请ACL权限。需要在module.json5文件中配置ohos.permission.WRITE_IMAGEVIDEO权限。类似这样: { // 允许修改用户公共目录的图片或视频文件。 "name": "ohos.permission.WRITE_IMAGEVIDEO", "reason": "$string:internet_permission_reason", "usedScene": { "when": "always" } }

import { abilityAccessCtrl, common } from '@kit.AbilityKit';
 import { photoAccessHelper } from '@kit.MediaLibraryKit';
 import fs from '@ohos.file.fs';
 import { http } from '@kit.NetworkKit';
 import { promptAction } from '@kit.ArkUI';
 @Entry
 @Component struct Index {
 @State message: string = 'Hello World'
 private appContext: common.Context = getContext(this);
 private atManager = abilityAccessCtrl.createAtManager();
  
 build() {
    Row() {
      Column() {
        Text(this.message)
        .fontSize(50)
        .fontWeight(FontWeight.Bold)
       Button("保存图片")
       .margin({ top: 10 })
       .onClick(async (event: ClickEvent) => { 
           //申请权限并保存图片到图库
         try { 
         //申请相册管理模块权限'ohos.permission.WRITE_IMAGEVIDEO' 
          this.atManager.requestPermissionsFromUser(this.appContext, [ 'ohos.permission.WRITE_IMAGEVIDEO' ]).then(async () => { 
         //权限申请成功,保存到图库
         let context = getContext();
         //获取相册管理模块的实例,用于访问和修改相册中的媒体文件
         let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context); 
         // onClick触发后10秒内通过createAsset接口创建图片文件,10秒后createAsset权限收回
         let uri = await phAccessHelper.createAsset(photoAccessHelper.PhotoType.IMAGE, 'jpg');
        // 创建媒体文件
        console.info('createAsset successfully, uri: ' + uri);
        let file = fs.openSync(uri, fs.OpenMode.READ_WRITE || fs.OpenMode.CREATE);
       let totalSize = 0;
       let httpRequest = http.createHttp();
        httpRequest.on("dataReceive", (data: ArrayBuffer) => {
       let writeLen = fs.writeSync(file.fd, data); 
       totalSize = totalSize + writeLen; });
       httpRequest.requestInStream('https://developer.huawei.com/allianceCmsResource/resource/HUAWEI_Developer_VUE/images/homeNew/next- pc.png',
        { method: http.RequestMethod.GET, connectTimeout: 3000, }, httpCode => {
          console.info('requestInStream HTTP CODE is', httpCode) })
           httpRequest.on("dataEnd", () => { 
           fs.close(file);
         promptAction.showDialog({ title: "下载图片结束,并保存至相册", message: `图片大小:${totalSize}字节` }) }) }) 
           } catch (err) { 
             console.error(`requestPermissionsFromUser call Failed! error: ${err.code}`); } }) }
           .width('100%') 
          }
        .height('100%') 
     } 
}


http://lihuaxi.xjx100.cn/news/2215503.html

相关文章

【云服务器介绍】选择指南 腾讯云 阿里云全配置对比 搭建web 个人开发 app 游戏服务器

​省流目录:适用于博客建站(2-4G)、个人开发/小型游戏[传奇/我的世界/饥荒](4-8G)、数据分析/大型游戏[幻兽帕鲁/雾锁王国]服务器(16-64G) 1.京东云-618专属活动 官方采购季专属活动地址&#x…

【线性代数】第七章-二次型

文章目录 一. 基本内容与重要结论1. 二次型、二次型矩阵2. 标准型与规范型3. 惯性指数4. 坐标变换5. 矩阵合同6. 正定矩阵与正定二次型 二. 主要定理1. 二次型变换为标准型的相关定理1.1. 二次型的坐标变换1.2. 任意二次型都可变换为标准型1.3.二次型的矩阵(就是是实…

[leetcode] 双指针集锦(python实现)

在解题时,双指针的思想常常可以帮助我们优化解法的时间空间复杂度。接下来,我将通过两道LeetCode的题来给大家讲解双指针的使用方法。 文章目录 题目1:Two Sum题目2:Three Sum双指针思想的总结 题目1:Two Sum 题目描述…

当在Python环境中安装Jupyter Notebook时遇到失败的情况

当在Python环境中安装Jupyter Notebook时遇到失败的情况,可能是由于多种原因导致的,包括但不限于环境问题、网络问题、依赖项缺失或版本冲突等。以下将详细探讨这些可能的原因,并提供相应的解决方案,以帮助您成功安装Jupyter Note…

【AI原理解析】— 文心一言模型

目录 模型架构 Transformer模型 编码器-解码器结构 训练过程 预训练 微调 关键技术 知识增强 上下文感知 个性化生成 推理与生成 应用场景 问答系统 文本生成 对话系统 模型架构 Transformer模型 文心一言的核心架构采用了Transformer模型,该模型是一…

C语言 | Leetcode C语言题解之第151题反转字符串中的单词

题目&#xff1a; 题解&#xff1a; void myResverse(char* s,int start,int end){while(start<end){char temp s[start];s[start] s[end];s[end] temp;start;end--;} } char* reverseWords(char* s) {int start 0;int end strlen(s)-1;myResverse(s,start,end);if(s[…

Java17 --- SpringSecurity之自定义配置

目录 一、基于用户的内存认证 二、基于数据库用户认证 2.1、添加数据库 2.2、添加相关pom依赖 2.3、测试实现 三、添加用户 四、密码加密 五、 自定义登录页 一、基于用户的内存认证 Configuration //EnableWebSecurity //开启springSecurity自定义配置&#xff0…

机器学习笔记:focal loss

1 介绍 Focal Loss 是一种在类别不平衡的情况下改善模型性能的损失函数最初在 2017 年的论文《Focal Loss for Dense Object Detection》中提出这种损失函数主要用于解决在有挑战性的对象检测任务中&#xff0c;易分类的负样本占据主导地位的问题&#xff0c;从而导致模型难以…