Zxing source code analysis (1) camera, zxingcamera
First, let's download the source code of zxing. There are a lot of resources on the Internet. I downloaded 2.3 of them. I have to say that the package provided by Google contains a wide range of functions.
After I decompress the downloaded package, find the android folder and import it to ecplise. Let's analyze the architecture 1 and book. If the query result is book information, you can choose to query the further details of the book. This package contains related categories for searching and displaying books. Ii. camera/camera. open is a class about cameras. The core class is CameraManager 3. clipboard 4. encode: a set of components for the encoding function. The core class is QRCodeEncoder, the final encoding is MultiFormatWriter Class 5. history: Scan history Management. The core class is HistoryManager. 6. result: The barcode scan results are divided into different types, all types, all are defined in com. google. zxing. client. result. in ParsedResultType, there are corresponding processing methods for different types; xxxResultHandler, all ResultHandler are included in this package. Different xxxResultHandler also provides several buttons to be displayed on the scan result page. The text of each button and events to be bound are analyzed from the source code of the camera, because I only use the scan and output results sections, the other sections will remove the camera section from a total of six categories: OpenCameraInterface: open camera class CameraConfigurationManager: Camera configuration class CameraManager: Core class, camera management class AutoFocusManager: No FrontLightMode: enumeration PreviewCallback: preview callback Class I. OpenCameraInterface. This is a class opened by a camera. The method inside is open (), that is, to open the camera, I commented out
Public static Camera open () {// obtain the number of cameras int numCameras = Camera. getNumberOfCameras (); // exit if (numCameras = 0) {Log if no camera is found. w (TAG, "No cameras! "); Return null;} int index = 0; while (index <numCameras) {// initialize the Camera Information Class Camera. cameraInfo cameraInfo = new Camera. cameraInfo (); // get the Camera information Camera. getCameraInfo (index, cameraInfo); // determines whether the camera is a rear camera if (cameraInfo. facing = Camera. cameraInfo. CAMERA_FACING_BACK) {break;} index ++;} // turn on the Camera 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 ;}
Enable the camera in this method
Ii. CameraConfigurationManager camera configuration class. In this class, we mainly configure parameters such as Preview resolution, Flash, and focus. The following methods mainly include initFromCameraParameters (). By calling the findBestPreviewSizeValue method, to get the best camera preview resolution
Void initFromCameraParameters (Camera camera) {// obtain the Camera Parameter Camera. parameters parameters = camera. getParameters (); WindowManager manager = (WindowManager) context. getSystemService (Context. WINDOW_SERVICE); Display display = manager. getdefadisplay display (); // construct a Point theScreenResolution = new Point (); // assign values to the Point, and display the screen width and High Resolution. getSize (theScreenResolution); screenResolution = theScreenResolution; Log. I (TAG, "Screen resolution:" + screenResolution); cameraResolution = findBestPreviewSizeValue (parameters, screenResolution); Log. I (TAG, "Camera resolution:" + cameraResolution );}
SetDesiredCameraParameters () method, sets the findBestPreviewSizeValue () method of the camera's flash and focus parameters, removes the inappropriate resolution, and selects the best resolution. 3. CameraManager is the core class of the entire camera, other classes are called in this class, which is used to uniformly manage camera initialization and parameters. openDriver method ()
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;} // sets the camera preview function theCamera. setPreviewDisplay (holder); // if (! Initialized) {initialized = true; // initialize the camera parameters and select the best preview resolution configManager. callback (theCamera); if (requestedFramingRectWidth> 0 & amp; timeout> 0) {setManualFramingRect (response, response); requestedFramingRectWidth = 0; callback = 0 ;}} Camera. parameters parameters = theCamera. getParameters (); String parametersFla Ttened = parameters = null? Null: parameters. flatten (); // Save these, temporarily try {// set necessary parameters, including focus, flashlight, and other 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 ");}}}}
These are the core methods of Camera. We can see that the program runs by calling CaptureActivity, and some methods of Camera are called in CaptureActivity, in CaptureActivity, use the initCamera (surfaceHolder); Method to start scanning and finally obtain the scan result. In the layout file
<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" />
One is a preview window, and the other is a scan window that is displayed with a custom display. At this point, I have summarized it and basically understood how it runs and the role of Camera's core methods.