二维码-SurfaceView的使用

说明

此时的SurfaceView主要是显示摄像头的数据, 不做其它功能用。

界面

  <SurfaceView android:id="@+id/preview_view"
               android:layout_width="fill_parent"
               android:layout_height="fill_parent"/>

逻辑

hasSurface的使用

hasSurface的使用

有效的避开重复的初始化listener。

1. 在onResume()中初始化

SurfaceView surfaceView = (SurfaceView) findViewById(R.id.preview_view);               
SurfaceHolder surfaceHolder = surfaceView.getHolder();                                 
if (hasSurface) {                                                                      
    // The activity was paused but not stopped, so the surface still exists. Therefore 
    // surfaceCreated() won't be called, so init the camera here.                      
    initCamera(surfaceHolder);                                                         
} else {                                                                               
    // Install the callback and wait for surfaceCreated() to init the camera.          
    surfaceHolder.addCallback(this);                                                   
}                                                                                      

initCamera()函数的解析

这个是重要的函数, 就是让SurfaceView显示出Camera的图像。


private void initCamera(SurfaceHolder surfaceHolder) {                                                             
    if (surfaceHolder == null) {                                                                                   
        throw new IllegalStateException("No SurfaceHolder provided");                                              
    }                                                                                                              
    if (cameraManager.isOpen()) {                                                                                  
        Log.w(TAG, "initCamera() while already open -- late SurfaceView callback?");                               
        return;                                                                                                    
    }                                                                                                              
    try {                                                                                                          
        cameraManager.openDriver(surfaceHolder);                                                                   
        // Creating the handler starts the preview, which can also throw a RuntimeException.                       
        if (handler == null) {                                                                                     
            handler = new CaptureActivityHandler(this, decodeFormats, decodeHints, characterSet, cameraManager);   
        }                                                                                                          
        decodeOrStoreSavedBitmap(null, null);                                                                      
    } catch (IOException ioe) {                                                                                    
        Log.w(TAG, ioe);                                                                                           
        displayFrameworkBugMessageAndExit();                                                                       
    } catch (RuntimeException e) {                                                                                 
        // Barcode Scanner has seen crashes in the wild of this variety:                                           
        // java.?lang.?RuntimeException: Fail to connect to camera service                                         
        Log.w(TAG, "Unexpected error initializing camera", e);                                                     
        displayFrameworkBugMessageAndExit();                                                                       
    }                                                                                                              
}                                                                                                                  

仔细查看,主要是对CameraManager的使用。

CameraManger介绍

CmaeraManager主要是对摄像头的操控类,也是二维码数据的采集端。

CameraManager实例化

实在onResume中实例化的

cameraManager = new CameraManager(getApplication());

openDriver(surfaceholder)函数的使用

    /**
     * Opens the camera driver and initializes the hardware parameters.
     *
     * @param holder The surface object which the camera will draw preview frames into.
     * @throws IOException Indicates the camera driver failed to open.
     */
    public synchronized void openDriver(SurfaceHolder holder) throws IOException {
        OpenCamera theCamera = camera;
        if (theCamera == null) {
            theCamera = OpenCameraInterface.open(requestedCameraId);
            if (theCamera == null) {
                throw new IOException("Camera.open() failed to return object from driver");
            }
            camera = theCamera;
        }

        if (!initialized) {
            initialized = true;
            configManager.initFromCameraParameters(theCamera);
            if (requestedFramingRectWidth > 0 && requestedFramingRectHeight > 0) {
                setManualFramingRect(requestedFramingRectWidth, requestedFramingRectHeight);
                requestedFramingRectWidth = 0;
                requestedFramingRectHeight = 0;
            }
        }

        Camera cameraObject = theCamera.getCamera();
        Camera.Parameters parameters = cameraObject.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 = cameraObject.getParameters();
                parameters.unflatten(parametersFlattened);
                try {
                    cameraObject.setParameters(parameters);
                    configManager.setDesiredCameraParameters(theCamera, true);
                } catch (RuntimeException re2) {
                    // Well, darn. Give up
                    Log.w(TAG, "Camera rejected even safe-mode parameters! No configuration");
                }
            }
        }
        cameraObject.setPreviewDisplay(holder);

    }

主要是最后一句话,

cameraObject.setPreviewDisplay(holder);

得到了Camera的数据。

OpenCameraInterface.open(requestedCameraId) 就是为了打开摄像头

/**
   * Opens the requested camera with {@link Camera#open(int)}, if one exists.
   *
   * @param cameraId camera ID of the camera to use. A negative value
   *  or {@link #NO_REQUESTED_CAMERA} means "no preference", in which case a rear-facing
   *  camera is returned if possible or else any camera
   * @return handle to {@link OpenCamera} that was opened
   */
  public static OpenCamera open(int cameraId) {

    int numCameras = Camera.getNumberOfCameras();
    if (numCameras == 0) {
      Log.w(TAG, "No cameras!");
      return null;
    }

    boolean explicitRequest = cameraId >= 0;

    Camera.CameraInfo selectedCameraInfo = null;
    int index;
    if (explicitRequest) {
      index = cameraId;
      selectedCameraInfo = new Camera.CameraInfo();
      Camera.getCameraInfo(index, selectedCameraInfo);
    } else {
      index = 0;
      while (index < numCameras) {
        Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
        Camera.getCameraInfo(index, cameraInfo);
        CameraFacing reportedFacing = CameraFacing.values()[cameraInfo.facing];
        if (reportedFacing == CameraFacing.BACK) {
          selectedCameraInfo = cameraInfo;
          break;
        }
        index++;
      }
    }

    Camera camera;
    if (index < numCameras) {
      Log.i(TAG, "Opening camera #" + index);
      camera = Camera.open(index);
    } else {
      if (explicitRequest) {
        Log.w(TAG, "Requested camera does not exist: " + cameraId);
        camera = null;
      } else {
        Log.i(TAG, "No camera facing " + CameraFacing.BACK + "; returning camera #0");
        camera = Camera.open(0);
        selectedCameraInfo = new Camera.CameraInfo();
        Camera.getCameraInfo(0, selectedCameraInfo);
      }
    }

    if (camera == null) {
      return null;
    }
    return new OpenCamera(index,
                          camera,
                          CameraFacing.values()[selectedCameraInfo.facing],
                          selectedCameraInfo.orientation);
  }

猜你喜欢

转载自blog.csdn.net/AdrianAndroid/article/details/71123969