zxing源码分析(一)camera部分

首先,我们先把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的核心方法的作用。

时间: 2024-10-12 17:16:21

zxing源码分析(一)camera部分的相关文章

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

前两个部分的地址是:ZXING源码分析(一)CAMERA部分  . zxing源码分析(二)decode部分 下面我们来看第三部分 result包下面有很多的类,其中的核心类是 com.google.zxing.client.android.result.ResultHandlerFactory:这个简单的工厂类,是整个result的所有的类的入口,我们就从这个类开始 ResultHandlerFactory: 这个类中有两个方法,分别是makeResultHandler()和parseResu

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

前三个部分的地址是:ZXING源码分析(一)CAMERA部分  . zxing源码分析(二)decode部分.zxing源码分析(三)result.history部分 前面三篇文章基本上已经把zxing的核心源码看的差不多了,现在我们在分析它所包含的功能的部分,其实history也是属于这一部分的,但是放在第三篇说了 核心类: com.google.zxing.client.android.wifi.WifiConfigManager wifi管理类,通过它用解析后的结果进行管理 com.goo

NineoldAndroids动画库源码分析

简介 做Android开发的同学很多都知道或者使用过一个动画库,那就是NineOldAndroids,它的作者及其牛X,好几个著名的开源库都是他的作品,具体大家可以看他的JakeWharton.简单来说,NineOldAndroids是一个向下兼容的动画库,主要是使低于API 11的系统也能够使用View的属性动画.以下是个其官网的简述 : Android library for using the Honeycomb (Android 3.0) animation API on all ver

Go Mobile 例子 basic 源码分析

OpenGL ES(OpenGL for Embedded Systems)是 OpenGL 三维图形API的子集,针对手机.PDA和游戏主机等嵌入式设备而设计.该API由Khronos集团定义推广,Khronos是一个图形软硬件行业协会,该协会主要关注图形和多媒体方面的开放标准. go 的 golang.org/x/mobile/gl 这个包 是基于OpenGL ES 2了, 文档在: https://godoc.org/golang.org/x/mobile/gl Khronos的api文档

Cocos2dx-3.x 中CCCamera相机类详解及源码分析

Cocos2d-x 3.3版本中加入了相机这个类,该类在3D游戏中是必不可少的,在3D立体游戏中,往往需要视野角度的变化,通过相机的变换才能观察和体验整个游戏世界. CCCamera类基本使用 在游戏中一般有两种类型的相机:一种是透视相机,它在3D游戏中十分常见:另一种是正交相机,它没有透视相机的近大远小的效果而是相机内任何位置的物体大小比例都是一样的. 上图是透视相机的原理图,一般来说,我们通过以下代码创建: _camera = Camera::createPerspective(60, (G

转:Ogre源码分析之Root类、Facade模式

Ogre源码分析(一)Root类,Facade模式 Ogre中的Root对象是一个Ogre应用程序的主入口点.因为它是整个Ogre引擎的外观(Façade)类.通过Root对象来开启和停止Ogre是最简单的一种方式:当你构造构造一个Root实例的时候你就启动了整个Ogre,当析构的时候(让它停止活动或者执行delete删除它)Ogre也就关闭了. API手册中这样介绍到:Ogre::Root 类代表了客户应用程序的入口点.在这里,应用程序可以获得系统的重要的访问权,也就是获取渲染系统 ,管理配置

Android 上千实例源码分析以及开源分析

Android 上千实例源码分析以及开源分析(百度云分享) 要下载的直接翻到最后吧,项目实例有点多. 首先 介绍几本书籍(下载包中)吧. 01_Android系统概述 02_Android系统的开发综述 03_Android的Linux内核与驱动程序 04_Android的底层库和程序 05_Android的JAVA虚拟机和JAVA环境 06_Android的GUI系统 07_Android的Audio系统 08_Android的Video 输入输出系统 09_Android的多媒体系统 10_

Android PhoneGap源码分析——白名单

对于单独的Web app应用来说,加载进来的url一般不能保证它的安全性.那么如何来处理url安全性的问题呢. 让我们来看看PhoneGap是如何做的. PhoneGap采用了白名单的形式,认为在白名单中的url认为是安全的,不在白名单中的url是不安全的.对于安全的url,PhoneGap的Web app会直接打开,对于不安全的url,会通过浏览器打开. 那么怎么增加白名单呢?PhoneGap是需要在配置文件res/xml/config.xml中设置,如下: <cordova> - <

Android7.0 MediaRecorder源码分析

最近在做Camera的方案(双进程打开一个Camera),涉及到使用MediaRecorder 进行录像,还是自己新建一套录像系统.接下来我将记录下本次源码分析的流程.  有关于Client和Server间的binder通信,会在下一篇里分析  (Client)  STEP ONE(Contructor) 1../base/media/java/android/media/MediaRecorder.java  在MediaRecorder的构造中就是使用了native_setup()的方法(N