当前位置: 首页 > news >正文

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

把一个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%') } 
}

相关文章:

  • C#操作MySQL从入门到精通(18)——使用组合查询
  • [12] 使用 CUDA 进行图像处理
  • Docker(一)-认识Docker
  • 【PL理论】(24) C- 语言:有块的作用域 | 更新的语法 | 新的语义域 | 环境 vs. 内存
  • SQLite JDBC驱动程序
  • SQL RIGHT JOIN 详解
  • 蚂蚁集团:2023年科研投入211.9亿元
  • LabVIEW图像采集处理项目中相机选择与应用
  • 目标检测算法YOLOv10简介
  • whisper 模型源码解读
  • JavaScript-转换成布尔型
  • 短视频矩阵系统/源码搭建---拆解热门视频功能开发上线
  • 如何选择合适的大模型框架:LangChain、LlamaIndex、Haystack 还是 Hugging Face
  • 【Linux硬盘读取】Windows下读取Linux系统的文件解决方案:Linux Reader4.5 By DiskInternals
  • GitLab教程(二):快速上手Git
  • JS 中的深拷贝与浅拷贝
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • 4. 路由到控制器 - Laravel从零开始教程
  • 5、React组件事件详解
  • git 常用命令
  • Gradle 5.0 正式版发布
  • JavaScript标准库系列——Math对象和Date对象(二)
  • javascript从右向左截取指定位数字符的3种方法
  • Meteor的表单提交:Form
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • Python实现BT种子转化为磁力链接【实战】
  • React-Native - 收藏集 - 掘金
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • vue的全局变量和全局拦截请求器
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 马上搞懂 GeoJSON
  • 使用parted解决大于2T的磁盘分区
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 学习ES6 变量的解构赋值
  • 原生Ajax
  • 栈实现走出迷宫(C++)
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • ​​​​​​​​​​​​​​Γ函数
  • ​MySQL主从复制一致性检测
  • $.ajax()
  • (04)odoo视图操作
  • (1)Android开发优化---------UI优化
  • (10)STL算法之搜索(二) 二分查找
  • (C++二叉树05) 合并二叉树 二叉搜索树中的搜索 验证二叉搜索树
  • (八十八)VFL语言初步 - 实现布局
  • (二十九)STL map容器(映射)与STL pair容器(值对)
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (面试必看!)锁策略
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (十三)Flask之特殊装饰器详解
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (一一四)第九章编程练习
  • (原创) cocos2dx使用Curl连接网络(客户端)