Android Camera 源码浅析

Android Camera 源码浅析

Android Camera源码浅析主要是分析SDK中Camera.java中的代码,如果你的此行不是这个目的,可以略过这篇文章。至于Android Camera的使用本篇文章也不会过多的阐述,分析的Camera.java为Android 4.4。

Camera中的接口

Camera类中总共有8个接口,分别是:(1)PreviewCallback(2)AutoFocusCallback(3)AutoFocusMoveCallback(4)ShutterCallback
(5)PictureCallback(6)OnZoomChangeListener(7)FaceDetectionListener(8)ErrorCallback.

(1)PreviewCallback是对于相机预览的回调,看一下它的回调方法 onPreviewFrame(byte[] data, Camera camera),其中data数组就是Camera.startPreview()方法调用之后每一帧的回调,也就是我们实时看到的画面。

(2)AutoFocusCallback是自动对焦的回调,看一下它的回调方法 onAutoFocus(boolean success, Camera camera),如果对焦成功这里的success的值会是true否则为false。这里需要注意的是如果当前设备的Camera不支持对焦,当onAutoFocus被调用时,这里会给出一个欺骗值,即success的值为true。

(3)AutoFocusMoveCallback是焦点移动时的自动回调,但是该回调只支持当前设备的Focus Mode的值为FOCUS_MODE_CONTINUOUS_VIDEO和FOCUS_MODE_CONTINUOUS_Picture的状态下,很多相机应用的自动对焦框的动画都是基于此回调来实现的。看一下它的回调方法 onAutoFocusMoving(boolean start, Camera camera),该方法在自动对焦开始和结束的时候都会调用。当开始对焦的时候start的值为true,当结束对焦的时候start的值为false。

(4)ShutterCallback是拍照获取照片片时的一个回调,主要用来播放一个声音或者其他操作用来提示用户已经获取到图片的数据。看一下它的回调方法 onShutter(),该方法的调用时机是不确定的,但是都会在捕获到照片那一刻的前后。该回调可以用于拍照声音的控制。

(5)PictureCallback该回调在Camera中有3个成员实例,分别为 mRawImageCallback、mJpegCallback、mPostviewCallback。我们平常使用最多的是mJpegCallback,看一下PictureCallback的回调方法 onPictureTaken(byte[] data, Camera camera),其中data数据就是我们拍照时要保存到本地的数据,也就是你所拍得的照片。

(6)OnZoomChangeListener是对焦距改变的监听,看一下它的回调方法 onZoomChange(int zoomValue, boolean stopped, Camera camera),在进行变焦的操作过程中,对于每一个新的zoom值,都会回调该方法。zoomValue是当前的焦距的值,stopped用来判断变焦是否结束。

(7)FaceDetectionListener是对人脸检测的监听,其回调方法是onFaceDetection(Face[] faces, Camera camera),faces主要是一个Face实例数组,里面存储了一些捕获的面部数据,有些元素的值可能是相等的。

(8)ErrorCallback是当Camera发生错误时的回调,其回调方法 onError(int error, Camera camera),error的值是当前发生的错误的错误码,其中最常见的Camera错误要当数Camera Error 100这个错误了,这个错误因为兼容性的问题,我目前还没有找到统一的处理方式。

Camera中的内部类

Camera类中总共有5个内部类,分别是(1)CameraInfo(2)Face(3)Size(4)Area(5)Parameters,其中最重要的是Parameters这个内部类

(1)CameraInfo类:主要存储有关Camera的一些信息,通过这个类我们可以获得当前Camera是前置摄像头还是后置摄像头、以及需要旋转的角度、以及是否支持关闭拍照声音。

(2)Face类:用来存储人脸检测时的一些面部信息,比如leftEye、rightEye、mouth等。

(3)Size类:主要用来存储照片的尺寸信息

(4)Area类:该类主要用于描述相机计算自动曝光、白平衡、聚焦时选择的测量与聚焦的区域。

(5)Parameters类:该类是几个内部类当中最重要的类,通过该类可以获取当前设备当前相机所支持的参数,如果是有自定义相机功能的应用这个类是肯定要使用到的。

Camera中的方法

Camera中的方法,这里只列出常用的方法:(1)getNumberofCameras():用来获取该设备有多少个可用的Camera。(2)getCameraInfo(int cameraId,CameraInfo cameraInfo):该方法主要是用来获取指定id的Camera的一些信息,其内部调用了本地方法_getCamreaInfo(cameraId,cameraInfo)。(3)open(int cameraId)该方法主要用来返回一个指定id的Camera对象。(4) open()打开第一个后置摄像头,如果没有后置摄像头会返回null(5)setPreviewDisplay(SurfaceHolder holder)和setPreviewTexture(SurfaceTexture surfaceTexture)设置用于预览图像的表面纹理,这两个方法必须使用一个。(6)startPreview()和stopPreview()这个两个方法是分别用来开始预览和结束预览,在调用startPreview之前一定要先调用setPreviewDisplay或setPreviewTexture。(7)cancelAutoFocus()取消自动对焦(8)setParameters(Parameters parameters)和getParameters()是对相机参数的操作,一个是指定当前Camera对象的设置参数,一个是获取当前Camera对象的参数(9)其他方法,大家可以自行看API。

Camera中容易抛异常的方法

在Camera相关的应用开发中,容易抛异常的方法有:startPreview、takePicture、getParameters、setPrameters。