在其它手机端,若想保存图片到相册,需要申请对应的权限,而鸿蒙中对应的权限为受限开放权限,普通应用一般不让申请,这个时候我们可以使用安全保存控件来临时申请权限,用于保存图片到相册。
受限开放权限
应用权限分为三类,一类是对所有应用开放,所有应用均可申请使用;一类是受限开放权限,仅少量符合特殊场景的应用可在通过审批后,使用受限权限;最后一类是仅对MDM(Mobile Device Management)设备管理应用开放。
保存图片到相机涉及到的权限是ohos.permission.WRITE_IMAGEVIDEO,仅特殊场景与功能才可申请此权限,例如应用需要克隆、备份或同步图片/视频类文件,其它场景下使用安全控件来临时申请权限。
使用安全控件保存本地图片到相机
我们先使用安全控件让用户点击临时获取权限,获取到权限后,再使用photoAccessHelper来将我们本地的图片保存在相册,示例如下
import { photoAccessHelper } from '@kit.MediaLibraryKit'
@Entry
@ComponentV2
struct Index {
build() {
Column() {
SaveButton({ icon: SaveIconStyle.LINES, text: SaveDescription.SAVE_TO_GALLERY, buttonType: ButtonType.Capsule })
.onClick(() => {
this.savePhotoToGallery().then(() => {
this.getUIContext().getPromptAction().showToast({ message: '保存成功' })
}).catch((err: Error) => {
this.getUIContext().getPromptAction().showToast({ message: err.message })
})
})
}
}
public async savePhotoToGallery(): Promise<void> {
const ctx = getContext()
const helper = photoAccessHelper.getPhotoAccessHelper(ctx)
const src = ctx.resourceDir + '/icon.png'
const request = photoAccessHelper.MediaAssetChangeRequest.createImageAssetRequest(ctx, src)
return helper.applyChanges(request)
}
}
以上示例请保证icon.png在本地真实的存在。当我们使用helper调用applyChanges时,因为是在安全控件点击后调用的,临时获取权限,可以正常执行,若不在安全控件内,则需保证已获取对应的权限。
## 使用安全控件保存服务端图片到相机
服务端图片我们一般使用下载服务将图片下载到本地,若本地不需要备份,则直接将下载好的图片buffer保存到相册即可。我们将本地图片转成buffer来模拟服务端下载后的图片,再使用photoAccessHelper创建一个相册图片资源,并将我们的图片buffer写入到这个图片资源中,就可以将图片保存到相册了,示例如下
import { photoAccessHelper } from '@kit.MediaLibraryKit'
import fs from '@ohos.file.fs'
@Entry
@ComponentV2
struct Index {
build() {
Column() {
SaveButton({ icon: SaveIconStyle.LINES, text: SaveDescription.SAVE_TO_GALLERY, buttonType: ButtonType.Capsule })
.onClick(() => {
this.savePhotoToGallery().then(() => {
this.getUIContext().getPromptAction().showToast({ message: '保存成功' })
}).catch((err: Error) => {
this.getUIContext().getPromptAction().showToast({ message: err.message })
})
})
}
}
public async savePhotoToGallery(): Promise<void> {
const ctx = getContext()
const helper = photoAccessHelper.getPhotoAccessHelper(ctx)
return Promise.all([helper.createAsset(photoAccessHelper.PhotoType.IMAGE, 'png').then((uri) => {
return fs.open(uri, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE)
}), ctx.resourceManager.getMediaContent($r('app.media.app_icon').id, 0)]).then((array) => {
fs.writeSync(array[0].fd, array[1].buffer)
fs.closeSync(array[0].fd)
})
}
}
使用保存确认弹窗保存图片
前面的方式都是强依赖于安全控件,但在有些场景下,我们没办法使用安全控件,比如在H5页面中,再比如在Flutter页面中等等,这个时候我们可以借助保存确认弹窗来保存图片。当我们通过photoAccessHelper调用showAssetsCreationDialog时,系统会弹出一个确认弹窗,用户点击允许,则我们可以将图片保存到相册,若用户点击禁止,则不能保存图片到相册。使用这种方式,我们就不用强依赖于安全控件了,示例如下
import { photoAccessHelper } from '@kit.MediaLibraryKit'
import fs from '@ohos.file.fs'
@Entry
@ComponentV2
struct Index {
@Local isShowHome: boolean = false
build() {
Column() {
Button('保存图片到相册').onClick(()=>{
this.savePhotoToGallery().then(() => {
this.getUIContext().getPromptAction().showToast({ message: '保存成功' })
}).catch((err: Error) => {
this.getUIContext().getPromptAction().showToast({ message: err.message })
})
})
}
}
public async savePhotoToGallery(): Promise<void> {
const ctx = getContext()
const helper = photoAccessHelper.getPhotoAccessHelper(ctx)
const src = ctx.resourceDir + '/icon.png'
const desFileUris = await helper.showAssetsCreationDialog([src], [{
title: 'test',
fileNameExtension: 'png',
photoType: photoAccessHelper.PhotoType.IMAGE
}])
const desFile = fs.openSync(desFileUris[0], fs.OpenMode.WRITE_ONLY)
const srcFile = fs.openSync(src, fs.OpenMode.READ_ONLY)
fs.copyFileSync(srcFile.fd, desFile.fd)
fs.closeSync(srcFile)
fs.closeSync(desFile)
}
}
以上示例请保存icon.png在本地真实存在。
相关推荐
综上所述,"cordova-android保存图片插件"是一个专为Android设计的工具,用于方便Cordova应用将图片保存到设备相册。虽然它不适用于iOS,但开发者可以通过其他途径解决这个问题。理解和使用这个插件需要对Cordova...
华为鸿蒙HarmonyOS开发整理资料汇总,共38份。 1学前必读:HarmonyOS学习资源主题分享 2学前必读:OpenHarmony-联盟生态资料合集 3-1.HarmonyOS概述:技术特性 3-2.HarmonyOS概述:开发工具与平台 3-3.HarmonyOS...
基于HarmonyOS 4开发的一款新闻类的鸿蒙APP源代码,代码完整下载即用。 基于HarmonyOS 4开发的一款新闻类的鸿蒙APP源代码,代码完整下载即用。基于HarmonyOS 4开发的一款新闻类的鸿蒙APP源代码,代码完整下载即用...
从提供的压缩包文件名称列表来看,这是一组包含9张高清壁纸的集合,每张图片可能都代表了鸿蒙HarmonyOS的不同方面或特性,比如创新、连接、多元和科技美感。这些无水印的壁纸不仅适合用作电脑桌面背景,也展示了鸿蒙...
### HarmonyOS应用开发实战——如何打开相册与音频列表 #### 一、概述 随着HarmonyOS生态的不断发展,越来越多的开发者开始投入到基于HarmonyOS的应用开发中。本文将详细介绍如何在HarmonyOS应用中实现打开相册...
鸿蒙HarmonyOS开发者资料大全鸿蒙系统开发资料汇总,包括如下: DevEco Studio 1.0 使用指南.pdf HarmonyOS-NFC开发指南.pdf HarmonyOS应用开发之页面开发.pdf HarmonyOS开发必备基础知识.pdf WLAN开发指南.pdf 图像...
### 全网首发鸿蒙 HarmonyOS NEXT星河版零基础入门到实战教程解析 #### 一、鸿蒙开发环境准备与工具下载 本教程旨在帮助初学者从零开始学习鸿蒙 HarmonyOS NEXT 星河版的开发技术。首先,我们需要准备开发环境。...
HarmonyOS应用开发者基础认证考试题目及答案HarmonyOS应用开发者基础认证考试题目及答案HarmonyOS应用开发者基础认证考试题目及答案HarmonyOS应用开发者基础认证考试题目及答案HarmonyOS应用开发者基础认证考试题目...
《全网首发黑马程序员鸿蒙 HarmonyOS NEXT星河版零基础入门到实战》是一套针对初学者精心设计的鸿蒙操作系统开发教程。本教程旨在帮助没有编程基础的学员快速掌握HarmonyOS的开发技能,通过丰富的实例和清晰的讲解,...
01.1 HarmonyOS示例应用介绍 01.2 编写一个HarmonyOS应用 01.3 应用编译_安装_运行 01.4 HarmonyOS应用系列课第1期答疑环节 02.1 HUAWEI_DevEco_简介 02.2 HarmonyOS_应用开发平台介绍 02.3 HarmonyOS设备开发平台...
HarmonyOS,华为自主开发的全场景分布式操作系统,旨在为用户提供无缝、一致的体验,跨越多种设备,从手机、手表到智能家居。本合集是专为HarmonyOS学习者准备的一系列资源,涵盖从基础概念到高级开发的全方位知识,...
【标题】"book_鸿蒙入门HarmonyOS应用开发_书中源码.zip" 提供了对鸿蒙操作系统(HarmonyOS)应用开发的基础教程资源,其中包含了一个名为 "book_HarmonyOS_demo-main" 的子文件。这个压缩包很可能是为初学者准备的...
在本项目中,我们主要关注的是基于HarmonyOS 4构建的一款刷题应用程序的源代码。...同时,它也是一个很好的学习案例,可以帮助开发者快速上手HarmonyOS应用的开发,提高编程技能,适应鸿蒙生态的开发环境。
全网首发黑马程序员鸿蒙 HarmonyOS NEXT星河版零基础入门到实战,零基础也能快速入门鸿蒙开发教程1
在这门课程中,我们将深入探索鸿蒙HarmonyOS平台的Java UI布局技术,结合新浪新闻、直聘App和华为商城等三个经典案例,从布局设计到实现细节,从交互体验到用户界面优化,逐步解析其UI布局的全面技术与设计思路。...
华为鸿蒙HarmonyOS开发者资料大全是一份专为想要学习和深入理解鸿蒙操作系统开发的初学者准备的综合资源包。这份7z压缩文件包含了丰富的教程、文档、示例代码和工具,旨在帮助开发者快速掌握鸿蒙系统的开发技能。...
HarmonyOS开发从入门到实践 掌握这些资源就够了
总的来说,HarmonyOS 鸿蒙工具箱是华为为开发者打造的一站式开发解决方案,涵盖了从项目创建到应用发布的整个流程,旨在降低开发难度,提高开发效率,推动鸿蒙生态的发展。开发者需要掌握这些工具的使用,才能更好地...
HarmonyOS,华为推出的全新操作系统,旨在为物联网时代提供统一的操作平台,覆盖从手机、智能手表到智能家居等各类设备。这份“HarmonyOS从入门到大神资料下载合集(上)”是专为开发者和爱好者设计的学习资源,帮助...
本资源提供了鸿蒙HarmonyOS应用开发者认证的题库和答案,涵盖了HarmonyOS应用开发的多个方面,包括容器组件、 Ability、Web组件、网络请求、首选项、自定义组件、弹窗组件、图片加载、网络权限等。通过学习和理解...