当前位置: 首页 > 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%') } 
}

相关文章:

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

把一个base64图片 保存到鸿蒙手机 相册中怎么实现呢? 下面有2中方法 方案一:可以通过安全控件「保存控件(SaveButton)」实现。该控件对应媒体库写入特权。应用集成保存控件后,用户点击该控件,应用会获取1…...

高速公路智能管理系统:构建安全畅通的数字大动脉

随着城市化进程的加速和交通需求的增长,高速公路系统作为城市交通的重要组成部分,正承担着越来越多的交通运输任务。为了提升高速公路的安全性、便捷性和智能化管理水平,高速公路智能管理系统应运而生。本文将深入探讨高速公路智能管理系统的…...

基于Java自习室在线预约系统 的设计与实现

博主介绍: 大家好,本人精通Java、Python、C#、C、C编程语言,同时也熟练掌握微信小程序、Php和Android等技术,能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验,能够为学生提供各类…...

摄像头校准之白平衡畸变坏点

摄像头校准之白平衡&畸变&坏点 1. 源由2. 校准内容3. 畸变校准一、畸变模型二、校准步骤1. 准备工作2. 特征点检测3. 计算内参数和畸变系数4. 畸变校正 三、验证和优化1. 视觉验证2. 误差评估3. 参数优化 4. 白平衡校准一、白平衡基础二、自动白平衡(AWB&am…...

【C++进阶】模板进阶与仿函数:C++编程中的泛型与函数式编程思想

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;C “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;栈和队列相关知识 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀模板进阶 &#x1f9e9;<&…...

OpenCV之cv::Scalar

在 OpenCV 中&#xff0c;cv::Scalar 是一个模板类&#xff0c;用于表示多通道的值。常用来表示颜色或其他具有多个分量的数据。在图像处理中&#xff0c;cv::Scalar 经常用于指定颜色。 cv::Scalar(255, 255, 255) 具体如何理解&#xff0c;取决于图像的颜色空间&#xff1a;…...

智能合约与身份验证:区块链技术的创新应用

一、引言 区块链&#xff0c;一个近年来备受瞩目的技术名词&#xff0c;已经从最初的数字货币领域扩展到了众多行业。那么&#xff0c;究竟什么是区块链&#xff1f;它为何如此重要&#xff1f;本文将深入剖析区块链技术的原理、应用及未来发展。 二、区块链的基本概念 区块…...

浔川身份证号码查询——浔川python科技社

Python获取身份证信息 公民身份号码是每个公民唯一的、终身不变的身份代码&#xff0c;由公安机关按照公民身份号码国家标准编制。每一个居民只能拥有一个唯一的身份证&#xff0c;它是用于证明持有人身份的一种法定证件。 身份证包含了个人的一些重要信息&#xff0c;比如&am…...

C++的标准容器及其应用

C的标准容器及其应用 数组&#xff08;array&#xff09;数组的特征应用实列 前向列表&#xff08;forward_list&#xff09;前向列表的特征应用实列 列表&#xff08;list&#xff09;列表的特征应用实列 有序映射&#xff08;map&#xff09;有序映射的特征应用实列 队列&…...

linux如何部署前端项目和安装nginx

要在Linux上部署前端项目并安装Nginx&#xff0c;你可以按照以下步骤操作&#xff1a; 安装Nginx: sudo apt update sudo apt install nginx 启动Nginx服务: sudo systemctl start nginx 确保Nginx服务开机自启: sudo systemctl enable nginx 部署前端项目&#xff0c;假设前…...

Coolify:24.2K 星星!使用全新、开源免费且自托管的替代方案,部署应用程序的最佳工具(停止使用 Vercel)

✨点击这里✨&#xff1a;&#x1f680;原文链接&#xff1a;&#xff08;更好排版、视频播放、社群交流、最新AI开源项目、AI工具分享都在这个公众号&#xff01;&#xff09; Coolify&#xff1a;24.2K 星星&#xff01;使用全新、开源免费且自托管的替代方案&#xff0c;部…...

Dubbo入门

Dubbo&#xff0c;听名字好像有点高大上&#xff0c;但实际上它就是个让不同的计算机程序之间能够互相交流的工具&#xff0c;专业点说&#xff0c;它是一个分布式服务框架。想象一下&#xff0c;你有好几个小团队&#xff0c;每个团队负责开发一个部分&#xff0c;最后这些部分…...

从零学习es8

配置 编辑 elasticsearch.yml xpack.security.enabled: true 单节点 discovery.type: single-node设置账号&#xff1a; elasticsearch-reset-password -u elastic 如果要将密码设置为特定值&#xff0c;请使用交互式 (-i) 参数运行该命令。 elasticsearch-reset-password -i…...

String.compareTo()方法详解

Java 中的 String.compareTo() 方法用于按字典顺序比较两个字符串。这个方法实现了 Comparable 接口&#xff0c;返回一个整数&#xff0c;表示字符串的相对顺序。 方法签名 public int compareTo(String anotherString)返回值 一个负整数&#xff1a;如果当前字符串在字典顺…...

Nintex流程平台引入生成式人工智能,实现自动化革新

工作流自动化提供商Nintex宣布在其Nintex流程平台上推出一系列新的人工智能驱动改进。这些增强显著减少了文档化、管理和自动化业务流程所需的时间。这些新特性为Nintex流程平台不断扩展的人工智能能力增添了新的亮点。 Nintex首席产品官Niranjan Vijayaragavan表示&#xff1a…...

永远不要做房间里“最聪明的人”(早懂早受益)

听好了&#xff0c;茶客&#xff0c;我要向你解释一些事情。 你的工作和职责是让客户认为他是房间里最聪明的人。 如果你完成了这项任务之后&#xff0c;还有多余的精力&#xff0c;应该用它来让你的高级合伙人显得像是房间里第二聪明的人。 只有履行了这两项义务之后&#xff…...

Leetcode 3177. Find the Maximum Length of a Good Subsequence II

Leetcode 3177. Find the Maximum Length of a Good Subsequence II 1. 解题思路2. 代码实现 题目链接&#xff1a;3177. Find the Maximum Length of a Good Subsequence II 1. 解题思路 这一题我一开始的思路是直接使用暴力的动态规划的方式进行实现&#xff0c;结果遇到了…...

程序员做电子书产品变现的复盘(2)

赚钱有多种&#xff0c;简单分为两类。 &#xff08;1&#xff09;手停口停型&#xff0c;这种工作在你积极从事时可能每天能带来数千甚至上万的收入&#xff0c;但一旦停止工作&#xff0c;收入就会大幅下降甚至归零&#xff0c;例如我们的日常工资。 &#xff08;2&#xf…...

Java中的JVM是什么?如何调优JVM的性能?

Java中的JVM&#xff08;Java Virtual Machine&#xff09;是一个虚构出来的计算机&#xff0c;是一个规范&#xff0c;它在运行Java程序时扮演着核心角色。调优JVM的性能可以通过内存管理、垃圾回收、编译器优化等方法来提升Java应用程序的性能和稳定性。 Java中的JVM&#x…...

大型医院手术麻醉系统源码,前端采用Vue,Ant-Design开发,稳定成熟

医院手麻系统源码&#xff0c;手术麻醉信息系统&#xff0c;C#源码 医院手术麻醉信息系统包含了手术申请、排班、术前、术中、术后&#xff0c;直至出院的全过程。通过与相关医疗设备连接&#xff0c;与大屏幕显示公告相连接&#xff0c;实现了手术麻醉临床应用数据链全打通。…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题&#xff1a;3564. 季节性销售分析 题目&#xff1a; 表&#xff1a;sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...