Skip to content

Commit

Permalink
Fix issue#7. Rewrite scan QRCode logic.
Browse files Browse the repository at this point in the history
  • Loading branch information
msdx committed Dec 2, 2015
1 parent 0c4a41a commit 8b4b7b6
Show file tree
Hide file tree
Showing 5 changed files with 100 additions and 230 deletions.

This file was deleted.

53 changes: 33 additions & 20 deletions zxing/src/main/java/com/github/yoojia/zxing/camera/Cameras.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.github.yoojia.zxing.camera;

import android.hardware.Camera;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
Expand All @@ -19,6 +20,8 @@ public class Cameras {
private final CameraManager mCameraManager;
private boolean mIsSurfaceViewReady = false;

private FocusManager mFocusManager;

private final SurfaceViewReadyCallback mViewReadyCallback = new SurfaceViewReadyCallback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
Expand All @@ -35,36 +38,52 @@ public void surfaceDestroyed(SurfaceHolder holder) {
}
};

private OneshotTask mPreviewTask = new OneshotTask() {
@Override
public void doThis() {
Log.d(TAG, "- NOW open camera and start preview...");
try {
mCameraManager.attachPreview(mPreviewSurfaceView.getHolder());
mCameraManager.startPreview();
if (mFocusManager.isAutoFocusEnabled()) {
mFocusManager.startAutoFocus(mCameraManager.getCamera());
}
} catch (IOException e) {
Log.e(TAG, "- Cannot attach to preview", e);
}
}
};

public Cameras(SurfaceView previewSurfaceView) {
mPreviewSurfaceView = previewSurfaceView;
mCameraManager = new CameraManager(previewSurfaceView.getContext());
final SurfaceHolder holder = mPreviewSurfaceView.getHolder();
holder.addCallback(mViewReadyCallback);
mFocusManager = new FocusManager();
}

public void start() {
Log.d(TAG, "- Try open camera and start preview...");
openCamera();
mPreviewTask.ready();
if (mIsSurfaceViewReady) {
Log.d(TAG, "openCameraDirectly");
mPreviewTask.run();
}
}

private void openCamera() {
try {
if (!mCameraManager.isOpen()) {
mCameraManager.open();
}
mPreviewTask.ready();
if (mIsSurfaceViewReady) {
Log.d(TAG, "openCameraDirectly");
mPreviewTask.run();
}
} catch (Exception e) {
Log.e(TAG, "- Cannot open camera", e);
}
}


public void stop() {
Log.d(TAG, "- Try stop preview and close camera...");
Log.d(TAG, "stopCameraDirectly");
mCameraManager.getCamera().setPreviewCallback(null);
mFocusManager.stopAutoFocus(mCameraManager.getCamera());
mCameraManager.stopPreview();
try {
mCameraManager.close();
Expand All @@ -73,18 +92,12 @@ public void stop() {
}
}

private OneshotTask mPreviewTask = new OneshotTask() {
@Override
public void doThis() {
Log.d(TAG, "- NOW open camera and start preview...");
try {
mCameraManager.attachPreview(mPreviewSurfaceView.getHolder());
mCameraManager.startPreview();
} catch (IOException e) {
Log.e(TAG, "- Cannot attach to preview", e);
}
public void startAutoFocus(int period, Camera.AutoFocusCallback callback) {
mFocusManager.setAutoFocus(period, callback);
if (mCameraManager.isOpen() && mFocusManager.isAutoFocusEnabled()) {
mFocusManager.startAutoFocus(mCameraManager.getCamera());
}
};
}

static abstract class OneshotTask implements Runnable {
private AtomicBoolean ready = new AtomicBoolean();
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import android.hardware.Camera;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;

import java.util.concurrent.atomic.AtomicInteger;

Expand All @@ -11,76 +12,81 @@
*/
public class FocusManager {

private final FocusEventsListener mFocusEventsListener;

private final AtomicInteger mPeriod = new AtomicInteger(0);

private final Handler mFocusHandler = new Handler(Looper.getMainLooper());

private AutoFocusTask mAutoFocusTask;

private final Camera.AutoFocusCallback mAutoFocusCallback = new Camera.AutoFocusCallback() {
@Override
public void onAutoFocus(boolean success, Camera camera) {
mFocusEventsListener.onFocus(success);
}
};

/**
* 创建对焦管理器,并指定对焦事件监听接口
* @param focusEventsListener 对焦事件监听接口
*/
public FocusManager(FocusEventsListener focusEventsListener) {
mFocusEventsListener = focusEventsListener;
}
private Camera.AutoFocusCallback mAutoFocusCallback;
private boolean mEnabledAutoFocus;

/**
* 请求相机执行对焦动作
*
* @param camera 相机对象
*/
public void requestAutoFocus(Camera camera){
camera.autoFocus(mAutoFocusCallback);
public void requestAutoFocus(Camera camera, Camera.AutoFocusCallback cb) {
camera.autoFocus(cb);
}

/**
* 开启定时自动对焦
*
* @param camera 相机对象
* @param ms 定时,单位:毫秒
*/
public void startAutoFocus(Camera camera, int ms){
if (ms < 100) {
throw new IllegalArgumentException("Auto Focus period time must more than 100ms !");
}
public void startAutoFocus(Camera camera) {
final String mode = camera.getParameters().getFocusMode();
if (Camera.Parameters.FOCUS_MODE_AUTO.equals(mode) || Camera.Parameters.FOCUS_MODE_MACRO.equals(mode)){
if (Camera.Parameters.FOCUS_MODE_AUTO.equals(mode) || Camera.Parameters.FOCUS_MODE_MACRO.equals(mode)) {
// Remove pre task
if (mAutoFocusTask != null) {
mFocusHandler.removeCallbacks(mAutoFocusTask);
}
mAutoFocusTask = new AutoFocusTask(camera);
mPeriod.set(ms);
mAutoFocusTask = new AutoFocusTask(camera, mAutoFocusCallback);
mFocusHandler.post(mAutoFocusTask);
}
}

/**
* @param ms 定时,单位:毫秒
* @param cb
*/
public void setAutoFocus(int ms, Camera.AutoFocusCallback cb) {
Log.d("FocusManager", "setAutoFocus:" + ms + ", " + cb);
if (ms < 100) {
throw new IllegalArgumentException("Auto Focus period time must more than 100ms !");
}
mPeriod.set(ms);
mAutoFocusCallback = cb;
mEnabledAutoFocus = cb != null;
}

/**
* 停止自动对焦
*/
public void stopAutoFocus(){
mPeriod.set(0);
public void stopAutoFocus(Camera camera) {
mEnabledAutoFocus = false;
mFocusHandler.removeCallbacks(mAutoFocusTask);
camera.cancelAutoFocus();
}

private class AutoFocusTask implements Runnable{
public boolean isAutoFocusEnabled() {
return mEnabledAutoFocus;
}

private class AutoFocusTask implements Runnable {

private final Camera mCamera;
private final Camera.AutoFocusCallback mAutoFocusCallback;

private AutoFocusTask(Camera camera) {
private AutoFocusTask(Camera camera, Camera.AutoFocusCallback cb) {
mCamera = camera;
mAutoFocusCallback = cb;
}

@Override public void run() {
requestAutoFocus(mCamera);
@Override
public void run() {
requestAutoFocus(mCamera, mAutoFocusCallback);
final int period = mPeriod.get();
if (period > 0) {
mFocusHandler.postDelayed(mAutoFocusTask, period);
Expand Down
Loading

0 comments on commit 8b4b7b6

Please sign in to comment.