小白也能开发相机?Sample来教你 精华
上期我们给大家介绍了HarmonyOS Sample,收到了不少小伙伴的反馈,想学习一下HarmonyOS相机开发,现在,他来了!
相机开发概览
相机是智能设备最重要的功能之一,它能捕捉美好的瞬间、记录关键的时刻,被广泛应用于日常生活中。本文将详细地讲解一个带有拍摄照片和录制视频功能的相机开发过程。
目前,HarmonyOS相机模块支持相机业务的开发,开发者可以通过已开放的接口实现相机硬件的访问、操作和新功能开发。如下图所示,是HarmonyOS为相机应用开发者提供的3个包的内容,包括方法、枚举、以及常量/变量,方便开发者更容易地实现相机功能:
相机的开发流程如图所示:
相机权限申请
在使用相机之前,需要申请相机的相关权限,比如获取设备的相机权限、麦克风权限、存储权限等。保证应用拥有相机硬件及其他功能权限。
视频链接
开发者需在config.json中配置相关的权限,如下所示:
获取相关权限的具体代码如下所示:
初始化相机界面
获取到设备权限后,需要初始化相机界面。通过getWindow()获取当前Ability对应的窗口,再通过addCallback()添加界面操作的回调。代码如下所示:
通过postTask()来执行相机任务:
相机设备创建
1 创建相机对象
相机界面准备好后,我们需要创建相机设备。在实现一个相机应用之前必须先创建一个独立的相机设备,然后才能继续相机的其他操作。CameraKit类是相机的入口API类,如下所示:
相机设备创建的代码如下:
创建相机设备成功后,在CameraStateCallback中会触发onCreated(Camera camera)回调,并且带回Camera对象,用于执行相机设备的操作。
2 配置预览
在使用相机的过程中,用户一般都是先看见预览画面才执行拍照或者其他功能,所以对于一个普通的相机应用,预览是必不可少的。在上述CameraStateCallback中,会调用configure()方法实现预览配置,通过triggerLoopingCapture()方法实现循环帧捕获,从而达到预览的目的。具体代码如下:
相机功能实现
相机的基本功能主要分为拍摄照片和录制视频,目前HarmonyOS为开发者提供了如下相机拍照功能实现的Camera操作类,开发者可以通过这些方法,实现各种相机应用的开发:
如下图所示是相机的使用过程,接下来的相机功能实现,也会根据此流程图来实现。
1 选择功能
通过初始化相机界面组件,设置点击事件侦听器来实现相机功能选择。代码如下所示:
2 切换摄像头
开始拍摄照片或录制视频时,由于相机默认打开后置摄像头,需根据场景切换前置摄像头或后置摄像头。如果检测到相机正在工作中,将执行release()方法释放当前相机设备。代码如下:
3 拍摄照片
拍照功能属于相机应用的最重要功能之一,而且照片质量对用户至关重要。相机模块基于相机复杂的逻辑,从应用接口层到器件驱动层都已经默认的做好了最适合用户的配置,这些默认配置尽可能地保证用户拍出的每张照片的质量。
实现单帧拍照
单帧拍照,其实就是单帧捕获的过程。通过设置点击事件侦听器setClickedListener(),来触发takeSingleCapture()方法,实现单帧捕获。具体代码如下:
实现连拍
连拍功能方便用户一次拍照获取多张照片,用于捕捉精彩瞬间。
同单帧拍照的实现流程一致,但连拍需要使用triggerMultiCapture(frameConfigs)方法用于多帧捕获。
存储照片
拍摄后的照片通过saveImage()实现照片存储。具体代码如下:
4 录制视频
配置音视频模块
录制视频除了要进行预览配置,还需要进行音视频模块的配置。
比如视频编码格式配置:
setRecorderVideoEncoder(Recorder.VideoEncoder.H264)
音频编码格式配置:
setRecorderAudioEncoder(Recorder.AudioEncoder.AAC)
以及视频的编码码率、帧捕获率、帧率配置等。代码如下所示:
开始录制
通过设置长按点击事件侦听器setLongClickedListener()来触发startRecord(),实现开始录制。代码如下:
停止录制
通过设置触摸事件侦听器setTouchEventListener()来触发stopRecord(),实现停止录制。
视频存储和照片存储类似,本文就不做赘述,更多相机的开发请参照HarmonyOS相机开发指导:
相机设备释放
使用完相机后,必须通过release()来关闭相机和释放资源,否则可能导致其他相机应用无法启动。一旦相机被释放,它所提供的操作就不能再被调用,否则会导致不可预期的结果,或是会引发状态异常。相机设备释放的示例代码如下:
至此,就完成了一个具有拍摄照片和录制视频功能的相机开发,开发者也可以通过合适的接口或者接口组合实现闪光灯控制、曝光时间控制、手动对焦和自动对焦控制、变焦控制、人脸识别以及更多的功能。
如果能直接Intent 相机,那该多好。
哎,我也遇到这个问题,不能intent 相机。自己开发太麻烦了。又不需要那么多功能。