相关问题
HarmonyOS组件截图保存到相册失败,预览图灰色
363浏览 • 1回复 待解决
HarmonyOS 组件截图然后保存到相册中后无法显示,尺寸为0
82浏览 • 1回复 待解决
获取网络图片并保存到相册
1278浏览 • 1回复 待解决
如何将Pixmap保存到本地文件?
361浏览 • 1回复 待解决
组件截图怎么保存将pixelMap存储到系统相册或应用沙箱
539浏览 • 1回复 待解决
HarmonyOS 如何实现获取用户头像保存到系统相册
508浏览 • 1回复 待解决
如何使用Web组件下载pdf文件并展示给用户
660浏览 • 1回复 待解决
把应用沙箱下的图片保存到图库
1006浏览 • 1回复 待解决
如何将像素点保存到图片文件
2225浏览 • 1回复 待解决
HarmonyOS PhotoViewPicker 保存到图库
418浏览 • 1回复 待解决
怎样保持文件并允许用户拷出来?
1834浏览 • 1回复 待解决
HarmonyOS组件截图后如何将PixelMap保存至系统相册
504浏览 • 1回复 待解决
能否应用内展示应用市场详情页并下载
666浏览 • 1回复 待解决
Hi3861数据保存到flash
9096浏览 • 1回复 已解决
HarmonyOS 如何将当前视图组件保存为图片并保存呢?
170浏览 • 1回复 待解决
是否支持应用内下载并安装更新包
334浏览 • 1回复 待解决
怎么下载网络上PDF保存到本地?
3653浏览 • 1回复 待解决
HarmonyOS如何将PixelMap保存到相册?
444浏览 • 1回复 待解决
如何获取窗口截图并显示在Image中?
331浏览 • 1回复 待解决
tiff数据怎么保存到postgresql数据库里?
3988浏览 • 1回复 待解决
如何把图片和文案结合,保存到相册
77浏览 • 0回复 待解决
视频流数据编码生成MP4文件保存到沙箱路径
897浏览 • 1回复 待解决
HarmonyOS如何把图片保存到手机相册
387浏览 • 1回复 待解决
怎么把视频保存到相册以及主机端?
3754浏览 • 1回复 待解决
HarmonyOS 录像的视频如何保存到系统相册
763浏览 • 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更新之后再进行图片文件读写操作。