一个相机最基本有三个类:
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,用低的帧数来拍摄。