OpenHarmony - 相机(Camera)的调用 原创 精华
作者:张明伟
一、前言
camera使用介绍
相机是一个系统的基础能力,能够通过调用相机进行拍照,在很多场景下都会使用到相机的调用,如人脸识别门禁,人脸解锁等操作。
本文主要介绍在OpenHarmony应用开发中ArkUI开发框架下相机应用的开发。
开发模式:Stage开发模式
SDK版本:3.2.2.5
开发环境:DevEco Studio 3.0 Release 3.0.0.993
效果展示
相机调用成功如下图:
二、实现步骤
1. 声明权限
1.1 在module.json5中配置权限
1.2 在MainAbility.ts中调用requestPermissionsFromUser方法申请权限
注意:权限需要在页面加载前提前申请,所以需要在调用相机的页面前添加一个过渡的页面。
2. 准备工作
2.1 导包
2.2 定义变量
2.3 工具方法
2.4 工具类
这个工具类主要是用来进行获取时间对相片进行命名的工具类。
3. 构建UI组件
页面主要分为2块,左边为相机的XComponent组件,右边为图片显示区域。拍完的照片能够显示在右边。XComponent组件作用于EGL/OpenGLES和媒体数据写入,并显示在XComponent组件。相关资料https://developer.harmonyos.com/cn/docs/documentation/doc-references/ts-basic-components-xcomponent-0000001333800561。
hml代码如下:
UI实现了对存储路径的选择,需要存储到沙箱路径还是媒体路径。
注意:沙箱路径需要加上"file://",查看对应的存储路径步骤:
-
打开hdc命令窗口;
-
cd /data/app/el2/100/base/com.chinasoft.photo/haps/entry/files进入
-
ls查看全部文件
4. 拍照流程
4.1 初始化相机
这一步需要在拍照前就进行,一般是在XComponent组件的onLoad()中进行的。
-
根据camera的getCameraManager方法获取CameraManager
-
通过CameraManager获取所有的相机数组,找到可用的相机,并获取相机的cameraid
-
创建图片接收器并进行订阅,获取receiver的surfaceId
-
通过CameraManager的createCameraInput(cameraid)创建相机输入流
-
通过camera的createPreviewOutput(sufaceId)创建相机预览输出流.这里sufaceId为XComponent的id
-
通过camera的createPhotoOutput(sufaceId)创建相机拍照输出流.这里sufaceId为图片接收器的surfaceId
-
会话管理:创建会话,并且配置会话的相机输入流,相机拍照输出流与相机预览流,提交配置,开始会话
至此,相机就能正常的显示出图像了。
4.2 用拍照方法拍摄照片
调用相机的输出流的capture方法进行拍照操作,会触发图片接收器的监听,进行对字节流的写入操作,保存到沙箱或者媒体。
4.3 保存图片
分为沙箱路径与媒体路径:
4.4 释放相机
在完成了相机的调用后,需要对相机的资源进行释放,否则再次调用的时候会一直被占用而导致黑屏。
三、总结
openHarmony对于相机的官方使用文档不太清晰,有许多的坑,需要去趟,在这个过程中我遇到的问题:
-
在相机的使用时,由于开发板上的相机获取到了两个,一个是外接USB的相机,一个应该是系统的,在获取相机的id的时候需要注意;
-
在保存相机拍照的图片的时候,保存到沙箱路径时显示不到页面上,需要在保存的路径前加上"file://"。
需要扩展研究的是进行相机的摄像操作,以及相机拍照与摄像的切换操作。
参考资料:
https://gitee.com/openharmony/app_samples/tree/master/media/Scan
https://gitee.com/openharmony/applications_camera
https://gitee.com/openharmony/docs/blob/OpenHarmony-3.2-Beta3/zh-cn/application-dev/media/camera.md
更多原创内容请关注:中软国际 HarmonyOS 技术团队
入门到精通、技巧到案例,系统化分享HarmonyOS开发技术,欢迎投稿和订阅,让我们一起携手前行共建鸿蒙生态。
非常完整的相机调用流程,必须支持
对于现在市场上的 越来越多的需要 人脸相关技术 实现 有很大借鉴帮助
感谢分享,很详细
目前在OpenHarmony3.2上调用相机,需要使用ohos-full-sdk,而非大家下载DevEco Studio所带的sdk,那个sdk被称作为public sdk。关于sdk的替换办法可以参考官方文档“ full-SDK替换指南”
涨知识了
Stage开发模式下module.json5中配置权限,字段应为
FA开发模式下config.json中配置权限,字段应为
否则会报错