Skip to content

Commit

Permalink
优化相机管理
Browse files Browse the repository at this point in the history
  • Loading branch information
YooJia.Chen committed Oct 8, 2015
1 parent cd12555 commit 5e00599
Show file tree
Hide file tree
Showing 9 changed files with 348 additions and 281 deletions.
31 changes: 17 additions & 14 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ ZXingMini已对ZXing生成二维码图做了封装,通过 QRCodeEncode 类可
.setCodeColor(0xFF000000) // 指定编码块颜色,默认为黑色
.setOutputBitmapWidth(dimension) // 生成图片宽度
.setOutputBitmapHeight(dimension) // 生成图片高度
.setOutputBitmapMargin(0) // 设置为没有白边
.setOutputBitmapPadding(0) // 设置为没有白边
.build();

final Bitmap _QRCodeImage = encoder.encode("你的文本内容");
Expand All @@ -45,9 +45,16 @@ ZXingMini已对ZXing二维码解码部分做了封装。通过 QRCodeDecode 类

```java

public class QRCodeScanActivity extends Activity{
private QRCodeSupport mQRCodeScanSupport;

private QRCodeScanSupport mQRCodeScanSupport;
private final Handler mHandler = new Handler();

private final Runnable mDelayAutoTask = new Runnable() {
@Override
public void run() {
mQRCodeScanSupport.startAuto(500);
}
};

@Override
protected void onCreate(Bundle savedInstanceState) {
Expand All @@ -56,35 +63,31 @@ ZXingMini已对ZXing二维码解码部分做了封装。通过 QRCodeDecode 类
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
setContentView(R.layout.activity_scan);

// 查找布局文件中的元素
ImageView capturePreview = (ImageView) findViewById(R.id.decode_preview);
final FinderView finderView = (FinderView) findViewById(R.id.capture_viewfinder_view);
SurfaceView surfaceView = (SurfaceView) findViewById(R.id.capture_preview_view);

// 创建扫描支持类
mQRCodeScanSupport = new QRCodeScanSupport(surfaceView, finderView);
mQRCodeScanSupport.setCapturePreview(capturePreview);

// 如何处理扫描结果
mQRCodeScanSupport.setOnScanResultListener(new QRCodeScanSupport.OnScanResultListener() {
mQRCodeScanSupport = new QRCodeSupport(surfaceView, new QRCodeSupport.OnResultListener() {
@Override
public void onScanResult(String notNullResult) {
Toast.makeText(QRCodeScanActivity.this, "扫描结果: " + notNullResult, Toast.LENGTH_SHORT).show();
}
});
mQRCodeScanSupport.setCapturePreview(capturePreview);

}

@Override
protected void onResume() {
mQRCodeScanSupport.onResume(this);
super.onResume();
mQRCodeScanSupport.onResume();
mHandler.postDelayed(mDelayAutoTask, 500);
}

@Override
protected void onPause() {
mQRCodeScanSupport.onPause(this);
super.onPause();
mQRCodeScanSupport.onPause();
mHandler.removeCallbacks(mDelayAutoTask);
}
}

Expand All @@ -94,5 +97,5 @@ ZXingMini已对ZXing二维码解码部分做了封装。通过 QRCodeDecode 类

dependencies {
...
compile 'com.github.yoojia:zxing:0.3@aar'
compile 'com.github.yoojia:zxing:0.6@aar'
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.SurfaceView;
import android.view.View;
import android.view.Window;
Expand All @@ -22,6 +23,15 @@ public class QRCodeScanActivity extends Activity{

private QRCodeSupport mQRCodeScanSupport;

private final Handler mHandler = new Handler();

private final Runnable mDelayAutoTask = new Runnable() {
@Override
public void run() {
mQRCodeScanSupport.startAuto(500);
}
};

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Expand All @@ -30,37 +40,29 @@ protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.activity_scan);

ImageView capturePreview = (ImageView) findViewById(R.id.decode_preview);
final FinderView finderView = (FinderView) findViewById(R.id.capture_viewfinder_view);
SurfaceView surfaceView = (SurfaceView) findViewById(R.id.capture_preview_view);

mQRCodeScanSupport = new QRCodeSupport(surfaceView, finderView);
mQRCodeScanSupport.setCapturePreview(capturePreview);

// 如何处理扫描结果
mQRCodeScanSupport.setOnScanResultListener(new QRCodeSupport.OnScanResultListener() {
mQRCodeScanSupport = new QRCodeSupport(surfaceView, new QRCodeSupport.OnResultListener() {
@Override
public void onScanResult(String notNullResult) {
Toast.makeText(QRCodeScanActivity.this, "扫描结果: " + notNullResult, Toast.LENGTH_SHORT).show();
}
});
mQRCodeScanSupport.setCapturePreview(capturePreview);

finderView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mQRCodeScanSupport.requestDecode();
}
});
}

@Override
protected void onResume() {
super.onResume();
mQRCodeScanSupport.onResume();
mHandler.postDelayed(mDelayAutoTask, 500);
}

@Override
protected void onPause() {
super.onPause();
mQRCodeScanSupport.onPause();
mHandler.removeCallbacks(mDelayAutoTask);
}
}
7 changes: 1 addition & 6 deletions zxing/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ apply plugin: 'com.github.dcendents.android-maven'
apply plugin: 'com.jfrog.bintray'

group = 'com.github.yoojia'
version = '0.5'
version = '0.6'

android {
compileSdkVersion 21
Expand All @@ -37,7 +37,6 @@ android {
dependencies {
compile 'com.google.zxing:core:3.2.1'
compile 'com.google.zxing:android-core:3.2.1'
compile fileTree(dir: 'libs', include: ['*.jar'])
}

tasks.withType(JavaCompile) {
Expand Down Expand Up @@ -125,7 +124,3 @@ artifacts {
archives javadocJar
archives sourcesJar
}

task findConventions << {
println project.getConvention()
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,16 +16,17 @@ public class AutoFocusManager implements Camera.AutoFocusCallback{
private final AutoFocusListener mAutoFocusListener;
private final boolean mAutoFocusEnabled;

private final AtomicInteger mScheduleMs = new AtomicInteger(0);
private final AtomicInteger mPeriod = new AtomicInteger(0);

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

private final Runnable mAutoFocusTask = new Runnable() {
@Override public void run() {
private final Runnable mFocusTask = new Runnable() {
@Override
public void run() {
requestAutoFocus();
final int delay = mScheduleMs.get();
if (delay > 0) {
startAutoFocus(delay);
final int period = mPeriod.get();
if (period > 0) {
repeatAutoFocus(period);
}
}
};
Expand All @@ -51,24 +52,24 @@ public void requestAutoFocus(){
}

public void startAutoFocus(int ms){
if (ms < 1000) {
throw new IllegalArgumentException("Auto Focus period tim to short !");
if (ms < 100) {
throw new IllegalArgumentException("Auto Focus period time must more than 100ms !");
}
if( ! mAutoFocusEnabled) {
return;
}
mAutoFocusHandler.removeCallbacks(mAutoFocusTask);
if (0 == mScheduleMs.get()){
mAutoFocusHandler.postDelayed(mAutoFocusTask, ms);
}else{
mAutoFocusHandler.post(mAutoFocusTask);
}
mScheduleMs.set(ms);
mFocusHandler.removeCallbacks(mFocusTask);
mPeriod.set(ms);
mFocusHandler.post(mFocusTask);
}

private void repeatAutoFocus(int period){
mFocusHandler.postDelayed(mFocusTask, period);
}

public void stopAutoFocus(){
mScheduleMs.set(0);
mAutoFocusHandler.removeCallbacks(mAutoFocusTask);
mPeriod.set(0);
mFocusHandler.removeCallbacks(mFocusTask);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
package com.github.yoojia.zxing.camera;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.graphics.Rect;
import android.graphics.YuvImage;
import android.hardware.Camera;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

import java.io.ByteArrayOutputStream;
import java.io.IOException;

/**
* @author 陈小锅 (yoojia.chen@gmail.com)
* @since 1.0
*/
public class CameraController {

private final static String TAG = "CAMERAS";

private final CameraManager mCameraManager;
private final SurfaceView mSurfaceView;

private final CameraSurfaceCallback mCameraSurfaceCallback = new CameraSurfaceCallback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
initCamera(holder);
}
};

private final AutoFocusListener mAutoFocusListener = new AutoFocusListener() {
@Override
public void onFocus(boolean focusSuccess) {
// 对焦成功后,请求触发生成 **一次** 预览图片
if (focusSuccess) {
mCameraManager.requestPreview(mPreviewCallback);
}
}
};

private Camera.PreviewCallback mPreviewCallback;

public CameraController(SurfaceView surfaceView) {
mCameraManager = new CameraManager(surfaceView.getContext().getApplicationContext());
mSurfaceView = surfaceView;
}

/**
* 跟随Activity的生命周期
*/
public void resume(){
final SurfaceHolder holder = mSurfaceView.getHolder();
holder.addCallback(mCameraSurfaceCallback);
}

/**
* 跟随Activity的生命周期
*/
public void pause(){
final SurfaceHolder holder = mSurfaceView.getHolder();
holder.removeCallback(mCameraSurfaceCallback);
mCameraManager.stopPreview();
mCameraManager.closeDriver();
}

public void requestFocus(){
mCameraManager.getAutoFocusManager().requestAutoFocus();
}

public CameraManager getCameraManager() {
return mCameraManager;
}

public void setPreviewCallback(Camera.PreviewCallback previewCallback) {
mPreviewCallback = previewCallback;
}

/**
* 生成一张预览图
*/
public Bitmap capture(CameraPreview cameraPreview){
final Camera.Parameters parameters = cameraPreview.camera.getParameters();
final int width = parameters.getPreviewSize().width;
final int height = parameters.getPreviewSize().height;
final YuvImage yuv = new YuvImage(cameraPreview.data, parameters.getPreviewFormat(), width, height, null);
final ByteArrayOutputStream out = new ByteArrayOutputStream();
yuv.compressToJpeg(new Rect(0, 0, width, height), 100, out);// Best
final byte[] bytes = out.toByteArray();
final Bitmap src = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
final Matrix matrix = new Matrix();
matrix.setRotate(90);
final int originWidth = src.getWidth();
final int originHeight = src.getHeight();
final int targetWH = originWidth > originHeight ? originHeight : originWidth;
final int offsetX = originWidth > originHeight ? (originWidth - originHeight): 0;
final int offsetY = originWidth > originHeight ? 0 : (originHeight - originWidth);
return Bitmap.createBitmap(src, offsetX, offsetY, targetWH, targetWH, matrix, true);
}

private void initCamera(SurfaceHolder holder){
if (mCameraManager.isOpen()){
return;
}
try {
mCameraManager.openDriver(holder);
}catch (IOException ioe) {
Log.w(TAG, ioe);
return;
}
mCameraManager.startPreview(mAutoFocusListener);
}

public static final class CameraPreview{

private final byte[] data;
private final Camera camera;

public CameraPreview(byte[] data, Camera camera) {
this.data = data;
this.camera = camera;
}
}
}
Loading

0 comments on commit 5e00599

Please sign in to comment.