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。

AndroidArticle

The repository is used to show how improve the level of Android skills.

声明:该Repository主要用来分享好的博文与学习资料,希望能够对自己摸索学习Android的人有所帮助。如果你有兴趣可以一起参与进来,如果能够对你产生帮助欢迎star或fork。以后会不定期的在这里分享好的文章与学习资源。

作为一个自学过来的Android程序员,我的知识体系或许不是太完善,但是我所积累的知识都是来源自网络或自己购买的书籍。在网上经常看到有人问如何自学Android、如何提高Android等诸如此类的问题。或许现在的我没有资格来告诉大家如何在Android上进阶或者如何成为Android开发高手,但是我可以告诉大家如何自学Android,毕竟我自己是在没有人指导的情况下一步一步地了解Android,开发Android的。

Android入门

首先说说自学Android吧:如果想做Android开发,JavaSe的知识不说精通但是最起码也要会基本的语法和能写基本的程序。如果你没有熟悉JavaSe的知识,个人建议你还是JavaSe的知识搞熟练了之后再学习Android。了解与熟悉完JavaSe的内容,我们就需要进入Android的世界了。作为过来人,我个人认为《疯狂Android讲义》这本书作为入门比较不错,想想当时貌似我就是翻了一下这本书入门的。当然这局限于我开始学习Android时,市面上的书籍远远没有现在多(据说《第一行代码》这本书也比较不错)。既然推荐了书籍,那么如何使用呢?个人建议在看每一块知识时,先把书上讲的理论知识搞懂,搞懂之后一定要动手实践去检验理论的理解。坚持每一块知识都这样做,把一本书看完时,你绝对掌握了Android开发的基本知识。这时你就可以自己写点简单的程序,比如写个记事本程序,闹钟程序等等。到此为止,你对于Android开发已经算是入门了,至于提高需要不断的做项目与阅读优秀的代码,多看一些有质量的博客。

Android提高

至于Android开发技能的提高,我现在也没有搞清楚到底提高到什么境界才是头。这里分模块来给大家分享值得阅的博文。

Android动画部分

Android属性动画深入分析:让你成为动画牛人

Android动画进阶—使用开源动画库nineoldandroids

Android属性动画完全解析(上),初识属性动画的基本用法

Android属性动画完全解析(中),ValueAnimator和ObjectAnimator的高级用法

Android属性动画完全解析(下),Interpolator和ViewPropertyAnimator的用法

Android自定义控件部分

android 自定义控件 自定义属性详细介绍

Android LayoutInflater原理分析,带你一步步深入了解View(一)

Android视图绘制流程完全解析,带你一步步深入了解View(二)

Android视图状态及重绘流程分析,带你一步步深入了解View(三)

Android自定义View的实现方法,带你一步步深入了解View(四)

Android自定义控件其实很简单

Android性能优化部分

Android APK安装包瘦身

Android性能优化典范

Android性能优化之渲染篇

Android性能优化之运算篇

Android性能优化之内存篇

Android性能优化之电量篇

Android性能优化典范 - 第2季

Android性能优化典范 - 第3季

SparseArray替代HashMap来提高性能

Android 性能小贴士

声明: 该篇博文我会不定期更新,如果喜欢改篇博文,请收藏原出处。相应的Repository的地址:https://github.com/gcgongchao/AndroidArticle