一个相机最基本有三个类:

1、Camera,相机类,关于相机的操作都在这个类中,并且Camera的内部类Camera.Parameters可以进行参数设置。

2、SurfaceView用来展示镜头捕捉影像的预览。

3、SurfaceHolder.CallBack用于将摄像头的影响数据传递到Application中。SurfaceHolder.CallBack有三个回调方法

surfaceCreated(SurfaceHolder holder)
surfaceDestroyed(SurfaceHolder holder)
surfaceChanged(SurfaceHolder holder, int format, int w, int h)


Camera和preview要按照一定顺序创建,先创建Camera。打开相机需要用Camera.open(),打开相机可能会比较耗时所以要单开一个线程中处理。打开相机可以在Activity的onCreate()中开启,如果放到onResume()中利于代码重用和容易控制。照相用Camera.takePicture。当底层Surface创建和销毁的时候在SurfaceHolder.CallBack中会回调。

任何Camera的改变都会回调surfaceChanged并重启预览。

不在使用相机要释放Camera和preview,在Surface要destroyed时要停止preview并且释放Camera。初始化一个Camera通常要停止preview。从安卓2.3以后允许通过getNumberOfCameras获取摄像头个数,开启摄像头可能发生异常,用open(int)指定摄像头,从2.3以后可以通过getCameraInfo获得是前置还是后置镜头和Img的方向。

实现SurfaceHolder.Callback会有三个回调。surfaceCreated,surfaceDestroyed,surfaceChanged。可以设置previewSize在设置前要先getSupportPreviewSizes,不能随便设定。

大部分属性可以在Camera.Parameters中设置,有一部分不可以包括:测光和对焦区域,脸部识别,延时摄影。

不是所有设备都支持设置的属性,或者只支持属性中的一部分。所以开发一个app要考虑支持哪些属性和支持属性中的哪些值。

设置属性要先getParameter后在setParameter。

在获取到Camera对象后可以随时更改参数,不过从软件更改参数到通过硬件获得相应图像需要一些延时。

有些参数不能随意改变,特别是改变Camera预览的尺寸和方向。你需要先停止preview,改变preview size然后重启preview。从4.0开始预览oriention不用重启preview就可以。

三个特征:

1、测光和对焦区域

从4.0开始允许用户指定对焦和测光区域。根据params.getMaxNumMeteryAreas()>0判断是否支持。

Camera.Aera表示一个区域接受两个参数一个矩形和这个举行的权重,可以将其加入集合中再通过setMeteryArea设置,可以加入多个区域。

2、脸部识别

如果照片中有人,那么拍照应该对人进行对焦和白平衡设置,4.0开始增加爱了人脸识别技术,当人脸识别运行后,setWhiteBalance,setFocusArea,setMeteringArea失效,

1)检查设备是否支持人脸识别

2)创建人脸识别,实现Camera.FaceDetectingListener

3)把人脸识别监听加入Camera

4)开启preview后开启人脸识别(每次重新preview也要开启)

3、延时摄影

用到MediaRecorder,用低的帧数来拍摄。