如何快速编写一个Camera的Demo

    最近在学习Camera相关的一些东西,再这里做一下笔记,也算给自己一份动力。


    由于工作需要,现在要开始学习Camera的一些应用和数据量的问题,由于之前一直是做bsp的,对于java开发不是特别熟悉,所以现在相当于重新开始,我的想法就是自己写一个Camera的demo,实现基本的预览拍照功能,以此为切入点,先了解应用的实现,然后再去一点点深入了解数据流等逻辑问题。(ps:之前自己学习了一点android app的开发,对于Android studio 、sdk 等工具和android app的生命周期等有点点了解,所以此文也就以此为基础,来开始记录)。

如何编写一个可以预览的Camera应用呢?

很多时候,我们都想自己写一个demo,但是由考虑到camera这种会调用系统数据通道的,做起来会比较麻烦,同时sdk中过关于Camera的接口和类也非常多,有点无从下手,其实我们大可不必担心,android发展到现在的版本,apk的开发工作已经非常系统化,sdk中已经尽可能的集成了很多应用的标准框架和接口,大家只需要按照步骤去执行调用,一般都不会有太大问题。下面我就介绍一下我最近学习的编写Camera的几个步骤,基本按照这个流程调用就可以完成Camera的预览了。

下面我们就来看一看快速编写一个可预览的Camera应用需要哪些步骤呢:

1、首先我们需要创建一个布局文件,也就是我们打开apk后显示的画面,因为是一个demo,所以我们的布局文件也很简单,就一个SurfaceView,用来现实Camera预览画面的,代码如下:

如何快速编写一个Camera的Demo

2、接下来就是在主类中onCreat加载布局文件,同时初始化控件调用initView(),在Android6.0 之后要求app需要获取系统权限,比如打开camera的权限,读写sdcard的权限等(用来存图,读取配置文件等)

如何快速编写一个Camera的Demo

3、 在initView中初始化了SurfaceView控件,同时需要装载SurfaceHold对象,用来监听SurfaceView的生命周期,我们可以把camera相关的初始化流程(initCamera2)装载在这个位置,为后面的camera打开流程做准备

如何快速编写一个Camera的Demo

4、在Camera的初始化流程中,我们启动了一个线程,同时设置了图像的数据格式和分辨率,建立一个图像可用监听器,为后面需要拍照或者做帧数据处理提供接口,如果你仅仅是为了预览,就只用建立一个线程就可以了,直接跳过第5步,看第6步就行

如何快速编写一个Camera的Demo

5、重写onImageAvailable 方法,可以在此处做一些你需要的处理,需要注意的是要这里能获取到数据,在后面需要将ImageRead的对象装载到后面previewRequestBuilder 中才行

如何快速编写一个Camera的Demo

6、在onCreat中我们去申请了权限,在权限申请ok后,会到下面这个回调函数中,我们在这个函数中去开启camera

如何快速编写一个Camera的Demo

 

7、开启camera的方法也很简单,就是获取到系统的Camera服务,然后直接调用openCamera方法开启,注意第一个参数cameraId就是camera的id号,一般1是前置,0是后置

如何快速编写一个Camera的Demo

8、在openCamera函数执行成功后,会进入stateCallback回调函数,这个里面就有三个方法,分别对应打开摄像头,断开摄像头以及报错的回调,我们在打开摄像头中加载预览函数,进入预览流程,同时要在断开摄像头中将CameraDevice释放

如何快速编写一个Camera的Demo

9、现在进入了Camera的预览流程了,我们依然使用系统的接口,首先是获取到CaptureRequest的builder,然后将surfaceView的对象加载进入,最后调用setRepeatingRequest方法进行数据预览。

如何快速编写一个Camera的Demo

(如果想让第5步中的方法也能跑起来,这里需要装载进ImageRead的对象,增加方法是

Arrays.asList(outputTarget)

修改为:

Arrays.asList(outputTarget,mImageReader.getSurface())

 

好了,这样我们一个简单的可以预览的Camera的demo就完成了,后面我们可以自己增加一些功能,比如前后置的切换,拍照存图,录像等等。