相关问题
HarmonyOS 组件截图并保存到系统相册有延迟
22浏览 • 1回复 待解决
HarmonyOS组件截图保存到相册失败,预览图灰色
465浏览 • 1回复 待解决
HarmonyOS 下载文件并保存到指定目录
38浏览 • 1回复 待解决
HarmonyOS 组件截图然后保存到相册中后无法显示,尺寸为0
189浏览 • 1回复 待解决
获取网络图片并保存到相册
1486浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何将图片保存到系统文件管理器并展示保存路径?
123浏览 • 1回复 待解决
组件截图怎么保存将pixelMap存储到系统相册或应用沙箱
684浏览 • 1回复 待解决
如何将Pixmap保存到本地文件?
482浏览 • 1回复 待解决
HarmonyOS Resource的文件如何保存到沙箱
35浏览 • 1回复 待解决
HarmonyOS 如何实现获取用户头像保存到系统相册
674浏览 • 1回复 待解决
如何将像素点保存到图片文件
2315浏览 • 1回复 待解决
把应用沙箱下的图片保存到图库
1147浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何下载网络图片并保存到手机?
145浏览 • 1回复 待解决
如何使用Web组件下载pdf文件并展示给用户
772浏览 • 1回复 待解决
HarmonyOS PhotoViewPicker 保存到图库
624浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何实现登录功能并保存用户信息?
162浏览 • 1回复 待解决
#鸿蒙通关秘籍# 在鸿蒙应用中下载文件时,如何从响应头信息中正确获取下载文件名并保存到本地?
99浏览 • 0回复 待解决
HarmonyOS组件截图后如何将PixelMap保存至系统相册
700浏览 • 1回复 待解决
怎样保持文件并允许用户拷出来?
1906浏览 • 1回复 待解决
Hi3861数据保存到flash
9321浏览 • 1回复 已解决
HarmonyOS 怎么把三方库,保存到本地项目,然后项目中引用保存到本地?
141浏览 • 1回复 待解决
HarmonyOS pixelMap保存的图片如何进行保存到相册
33浏览 • 1回复 待解决
能否应用内展示应用市场详情页并下载
763浏览 • 1回复 待解决
HarmonyOS如何将PixelMap保存到相册?
570浏览 • 1回复 待解决
HarmonyOS 如何将当前视图组件保存为图片并保存呢?
341浏览 • 1回复 待解决
在浏览器的工具栏中,截图是常见的功能之一。本文介绍如何使用OH API10新增的componentSnapshot接口实现应用内组件截图,然后将截屏接口输出的图片通过FilePicker保存到系统文管,或者通过photoAccessHelper 保存到系统图库。
效果呈现
运行环境
SDK API 10
实现思路
场景一:截图通过FilePicker保存到系统文管
组件截图使用componentSnapshot接口即可,但是参考文档文件管理-保存用户文件过程中,发现在开发者视角下将图片保存到系统文管存在2个问题:
1. photoViewPicker.save 拉起FilePicker系统文管界面,然后用户选择目标文件夹进行文件保存,保存成功后,返回保存图片文件的uri。如下文档示例:
根据photoViewPicker.save接口规范,返回的uri权限是读写权限,
不能在picker的回调里直接使用此uri进行打开文件操作,需要定义一个全局变量保存uri,使用类似一个按钮去触发打开文件。
但是,应用只有一个截屏按钮,在该按钮的onClick回调中需要执行截屏+拉起FilePicker界面选择目标文件夹+读写图片文件操作。
根据
JS的事件循环,如果在picker回调外使用setTimeout延迟执行获取uri后的文件读写操作,开发者无法确定用户在photoViewPicker.save拉起的文件管理器页面停留多长时间,什么时候picker回调执行结束,延迟执行时间未知。如下代码:
如果用户文件管理器页面操作大于setTimeout的1s,即在picker回调返回之前触发了setTimeout内的读写操作,会由于uri为空而导致文件打开(fs.openSync)时出现
js crash错误。
2.文件写操作接口为writeSync(fd: number, buffer: ArrayBuffer | string),截屏接口输出为PixelMap图片对象,开发者的做法可能会根据接口入参的类型,将PixelMap直接转为ArrayBuffer,然后将ArrayBuffer直接进行读写:
但是这种做法虽然可以成功保存图片,但是会导致图片格式错误,需要一个完整的示例去指导用户进行读写图片操作。
针对问题1,使用@Watch监听photoViewPicker.save返回的uri,当uri更新之后再进行图片文件读写操作,这样可以避免uri为空的js crash错误。
针对问题2,需要先将PixelMap图片对象编码成不同格式的存档图片,然后再用于后续处理,如保存、传输等。
场景二:通过photoAccessHelper 保存到系统图库
由于创建相册为system接口,三方应用不可调用,所本场景只使用public接口保存在图库默认的相册里。更多接口介绍可查看相册管理相关文档。
方案介绍
场景一方案
1. componentSnapshot.get("root"),应用内组件截图,输出PixelMap图片对象
2. photoViewPicker.save(photoSaveOptions),拉起FilePicker选择目标文件夹,保存图片文件,输出文件保存的uri
3. @Watch监听photoViewPicker.save返回的uri,当uri更新之后再进行图片文件读写操作
场景二方案
类似于场景一:
1.componentSnapshot.get(“root”),应用内组件截图,输出PixelMap图片对象。
2.phAccessHelper.createAsset,调用createAsset接口创建图片资源,拿到返回的uri。
3。@Watch监听photoViewPicker.save返回的uri,当uri更新之后再进行图片文件读写操作。