首先,我们先把zxing的源代码给下载下来,这个网上有很多,我下载的是2.3的,不得不说这个谷歌提供的包包含的功能还是很全面的。

    我把下载的包解压后,找到android文件夹,导入到ecplise中,我们来分析一下,里面的架构
    一、book,如果查询的结果是图书信息,用户可以选择查询该书的进一步详细信息,该包,包含了搜索与展示书籍的相关类。
    二、camera/camera.open 这个一个关于摄像头的类,核心类是CameraManager
    三、clipboard 剪贴板
    四、encode:编码功能的各个组件集合,核心类为QRCodeEncoder,最终实施编码的是MultiFormatWriter类
    五、history:扫描历史管理,核心类是HistoryManager
    六、result: 条形码扫描的结果被分为不同的类型,所有的类型,都定义在com.google.zxing.client.result.ParsedResultType中,对于不同的类型都有对应的处理方法;xxxResultHandler,所有的ResultHandler都包含在此包中。不同的xxxResultHandler还提供了扫描结果页面要展示几个button,每个button的文本及需要绑定的事件等等
   
   我们先从相机的源码部分开始分析,因为我只会用到扫描和输出结果部分,其它的部分将会去掉
      相机部分一共有六个类,分别是
      OpenCameraInterface :打开相机类
      CameraConfigurationManager:相机配置类
      CameraManager:  核心类,相机管理类    
      AutoFocusManager:暂时没有看
      FrontLightMode:枚举
      PreviewCallback:预览回调类
一、OpenCameraInterface,这是一个摄像头打开的类,里面的方法为open(),即打开摄像头,我注释了一下
public static Camera open() {
// 获取摄像头的数量
int numCameras = Camera.getNumberOfCameras();
//如果没有找到相机则退出
if (numCameras == 0) {
Log.w(TAG, "No cameras!");
return null;
} int index = 0;
while (index < numCameras) {
//初始化相机信息类
Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
//获取相机的信息
Camera.getCameraInfo(index, cameraInfo);
//判断是否是后置摄像头
if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK) {
break;
}
index++;
} //打开相机
Camera camera;
if (index < numCameras) {
Log.i(TAG, "Opening camera #" + index);
camera = Camera.open(index);
} else {
Log.i(TAG, "No camera facing back; returning camera #0");
camera = Camera.open(0);
} return camera;
}

从这个方法中把摄像头打开

     二、CameraConfigurationManager摄像头配置类,在这个类中主要是配置了预览分辨率、闪光灯和焦点等参数
       下面的方法主要有 initFromCameraParameters(),通过调findBestPreviewSizeValue方法,来获取最佳的相机预览分辨率
  void initFromCameraParameters(Camera camera) {
//获取相机的参数
Camera.Parameters parameters = camera.getParameters();
WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = manager.getDefaultDisplay();
//构造一个点
Point theScreenResolution = new Point();
//给点进行赋值,屏幕的宽和高 Resolution分辨率的意思
display.getSize(theScreenResolution);
screenResolution = theScreenResolution;
Log.i(TAG, "Screen resolution: " + screenResolution);
cameraResolution = findBestPreviewSizeValue(parameters, screenResolution);
Log.i(TAG, "Camera resolution: " + cameraResolution);
}
   setDesiredCameraParameters() 方法,设置相机的闪光灯和焦点等参数
   findBestPreviewSizeValue() 方法,去除掉不合适的分辨率,来选择最佳的分辨率
 三、CameraManager是整个摄像头的核心类,另外几个类都是在这个类中调用的,用它来对相机的初始化和参数进行统一的管理
       openDriver方法()

public synchronized void openDriver(SurfaceHolder holder) throws IOException {
Camera theCamera = camera;
if (theCamera == null) {
theCamera = OpenCameraInterface.open();
if (theCamera == null) {
throw new IOException();
}
camera = theCamera;
}
//设置摄像头预览功能
theCamera.setPreviewDisplay(holder); //初始化执行的操作
if (!initialized) {
initialized = true;
//初始化相机的参数,选择最佳的预览分辨率
configManager.initFromCameraParameters(theCamera);
if (requestedFramingRectWidth > 0 && requestedFramingRectHeight > 0) {
setManualFramingRect(requestedFramingRectWidth, requestedFramingRectHeight);
requestedFramingRectWidth = 0;
requestedFramingRectHeight = 0;
}
} Camera.Parameters parameters = theCamera.getParameters();
String parametersFlattened = parameters == null ? null : parameters.flatten(); // Save these, temporarily
try {
//设置必要的参数,包括焦点,闪光灯等
configManager.setDesiredCameraParameters(theCamera, false);
} catch (RuntimeException re) {
// Driver failed
Log.w(TAG, "Camera rejected parameters. Setting only minimal safe-mode parameters");
Log.i(TAG, "Resetting to saved camera params: " + parametersFlattened);
// Reset:
if (parametersFlattened != null) {
parameters = theCamera.getParameters();
parameters.unflatten(parametersFlattened);
try {
theCamera.setParameters(parameters);
configManager.setDesiredCameraParameters(theCamera, true);
} catch (RuntimeException re2) {
// Well, darn. Give up
Log.w(TAG, "Camera rejected even safe-mode parameters! No configuration");
}
}
} }
以上这些都是Camera的核心方法,我们可以看到,程序是通过调用CaptureActivity来实现运行的,在CaptureActivity中调用了Camera的一些方法,在CaptureActivity中通过initCamera(surfaceHolder);这个方法,开始扫描,最后得到扫描的结果。而布局文件中

<SurfaceView android:id="@+id/preview_view"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/> <com.google.zxing.client.android.ViewfinderView
android:id="@+id/viewfinder_view"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:visibility="gone" />
一个是预览的窗口,一个是用来自定义显示的扫描的窗口。到此,就总结完了,基本上弄懂了它是怎么运行的,以及Camera的核心方法的作用。
 
 
                                                                         
     
 

二维码zxing源码分析(一)camera部分的更多相关文章

  1. 二维码zxing源码分析(五)精简代码

    由于工作的需要,我并不是需要二维码扫描的所有的功能,我只是需要扫一扫,并显示出来图片和url就行,于是我们就要精简代码了,源码已经分析完了,精简起来就方便多了,源码分析请看 二维码zxing源码分析( ...

  2. 二维码zxing源码分析(四)wifi部分

    前三个部分的地址是:ZXING源码分析(一)CAMERA部分  . zxing源码分析(二)decode部分.zxing源码分析(三)result.history部分 前面三篇文章基本上已经把zxin ...

  3. 二维码zxing源码分析(二)decode部分

           在上一篇博客中分析了zxing怎么打开摄像头,并且扫描结果,那么扫描之后的数据呢,是不是就要解析了呢,那我们看一下zxing怎么解析这个数据的.       上一篇博客地址ZXING源码 ...

  4. 二维码扫描 zxing源码分析(三)result、history部分

    前两个部分的地址是:ZXING源码分析(一)CAMERA部分  . zxing源码分析(二)decode部分 下面我们来看第三部分 result包下面有很多的类,其中的核心类是 com.google. ...

  5. zxing源码分析——QR码部分

    Android应用横竖屏切换 zxing源码分析——DataMatrix码部分 zxing源码分析——QR码部分 2013-07-10 17:16:03|  分类: 默认分类 |  标签: |字号大中 ...

  6. 一步步实现windows版ijkplayer系列文章之二——Ijkplayer播放器源码分析之音视频输出——视频篇

    一步步实现windows版ijkplayer系列文章之一--Windows10平台编译ffmpeg 4.0.2,生成ffplay 一步步实现windows版ijkplayer系列文章之二--Ijkpl ...

  7. Alink漫谈(二十) :卡方检验源码解析

    Alink漫谈(二十) :卡方检验源码解析 目录 Alink漫谈(二十) :卡方检验源码解析 0x00 摘要 0x01 背景概念 1.1 假设检验 1.2 H0和H1是什么? 1.3 P值 (P-va ...

  8. 方维 o2o app源码出售

    方维 o2o app源码出售 方维o2oapp源码出售 1.本人官方5万购买,现把方维o2o app 源码低价出售: 2.包括网站源码本地搭建包成功提供指导 3.包括网站说明文档,不包含app说明文档 ...

  9. Ubuntu12.04下zxing源码编译

    1.下载zxing源码 git clone https://github.com/15903016222/zxing-cpp.git 2.安装依赖工具cmake sudo apt-get instal ...

随机推荐

  1. ueditor-图片上传是报错

    通过查看上面的图片中的[详细信息]可以看到是因为读取控件的路径的过程中错了导致的,因此需要用如下办法解决. 解决办法: 将ueditor.config.js中的一下代码中的路径修改为ueditor路径 ...

  2. discuz制作

    discuz x1.5模板制作图文教程[1] 在开始前,先了介绍一下discuz!的几个模板文件:1.        header.htm ------------------------------ ...

  3. .cmd文件不小心管理记事本打开的恢复

    比如不小心将.cmd文件关联成用记事本打开了,此时须要删除注冊表: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explor ...

  4. Javascript 异步加载详解

    Javascript 异步加载详解 本文总结一下浏览器在 javascript 的加载方式. 关键词:异步加载(async loading),延迟加载(lazy loading),延迟执行(lazy ...

  5. 代码片段 - Golang 实现简单的 Web 服务器

    ------------------------------ 下面一段代码,实现了最简单的 Web 服务器: 编译环境: Linux Mint 18 Cinnamon 64-bit Golang 1. ...

  6. socketpair理解

    转载:http://liulixiaoyao.blog.51cto.com/1361095/533469/ 今天跟人谈到socketpair的问题,晚上回来写了个程序验证下自己的猜测! 先说说我的理解 ...

  7. 动态引入Js文件

    var src = "/Scripts/Test.js"; $("<script type = 'text/javascript' src='" + sr ...

  8. WinForm中DefWndProc、WndProc与IMessageFilter的区别

    这篇文章主要介绍了WinForm中DefWndProc.WndProc与IMessageFilter的区别,较为详细的分析了WinForm的消息处理机制,需要的朋友可以参考下     一般来说,Win ...

  9. Tested work with China Digiprog 3 4.94 mileage programmer

    I was thinking about buying a Digiprog3 clone from China I know that YANHUA Digiprog 3 is the best a ...

  10. 【阿里云产品公测】结构化数据服务OTS之JavaSDK初体验

    [阿里云产品公测]结构化数据服务OTS之JavaSDK初体验 作者:阿里云用户蓝色之鹰 一.OTS简单介绍 OTS 是构建在阿里云飞天分布式系统之上的NoSQL数据库服务,提供海量结构化数据的存储和实 ...