Skip to content

Commit

Permalink
Update
Browse files Browse the repository at this point in the history
  • Loading branch information
YooJia.Chen committed Nov 25, 2015
1 parent 1e024bf commit fa06337
Show file tree
Hide file tree
Showing 9 changed files with 254 additions and 231 deletions.
30 changes: 15 additions & 15 deletions app/src/main/java/com/github/yoojia/zxing/app/CameraActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -34,30 +34,30 @@ protected void onCreate(Bundle savedInstanceState) {
SurfaceView surfaceView = (SurfaceView) findViewById(R.id.capture_preview_view);
mCamera = new Cameras(surfaceView);

mCamera.setPreviewCallback(new Camera.PreviewCallback() {
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
Bitmap b = mCamera.capture(new Cameras.CameraPreview(data, camera));
image.setImageBitmap(b);
}
});
surfaceView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mCamera.getCameraManager().getFocusManager().requestAutoFocus();
}
});
// mCamera.setPreviewCallback(new Camera.PreviewCallback() {
// @Override
// public void onPreviewFrame(byte[] data, Camera camera) {
// Bitmap b = mCamera.capture(new Cameras.CameraPreview(data, camera));
// image.setImageBitmap(b);
// }
// });
// surfaceView.setOnClickListener(new View.OnClickListener() {
// @Override
// public void onClick(View v) {
// mCamera.getCameraManager().getFocusManager().requestAutoFocus();
// }
// });
}

@Override
protected void onResume() {
super.onResume();
mCamera.onResume();
mCamera.start();
}

@Override
protected void onPause() {
super.onPause();
mCamera.onPause();
mCamera.stop();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,19 +24,19 @@ public class CameraController {
private final CameraManager mCameraManager;
private final SurfaceView mSurfaceView;

private final CameraSurfaceCallback mCameraSurfaceCallback = new CameraSurfaceCallback() {
private final SurfaceViewReadyCallback mSurfaceViewReadyCallback = new SurfaceViewReadyCallback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
if (mCameraManager.isOpen()){
return;
}
try {
mCameraManager.open(holder);
mCameraManager.open(/*holder*/);
}catch (IOException ioe) {
Log.w(TAG, ioe);
return;
}
mCameraManager.startPreview(mFocusEventsListener);
// mCameraManager.startPreview(mFocusEventsListener);
}
};

Expand All @@ -45,7 +45,7 @@ public void surfaceCreated(SurfaceHolder holder) {
public void onFocus(boolean focusSuccess) {
// 对焦成功后,请求触发生成 **一次** 预览图片
if (focusSuccess) {
mCameraManager.requestPreview(mPreviewCallback);
mCameraManager.setPreviewCallback(mPreviewCallback);
}
}
};
Expand All @@ -64,7 +64,7 @@ public void resume(){

public void onResume(){
final SurfaceHolder holder = mSurfaceView.getHolder();
holder.addCallback(mCameraSurfaceCallback);
holder.addCallback(mSurfaceViewReadyCallback);
}

@Deprecated
Expand All @@ -75,21 +75,21 @@ public void pause() {
public void onPause(){
// 暂停相机
final SurfaceHolder holder = mSurfaceView.getHolder();
holder.removeCallback(mCameraSurfaceCallback);
holder.removeCallback(mSurfaceViewReadyCallback);
mCameraManager.stopPreview();
mCameraManager.close();
// mCameraManager.close();
}

/**
* 请求相机对焦
*/
public void requestFocus(){
final FocusManager focusManager = mCameraManager.getFocusManager();
if (focusManager != null) {
focusManager.requestAutoFocus();
}else{
Log.e(TAG, "- Request auto focus, but camera was STOP !");
}
// final FocusManager focusManager = mCameraManager.getFocusManager();
// if (focusManager != null) {
// focusManager.requestAutoFocus();
// }else{
// Log.e(TAG, "- Request auto focus, but camera was STOP !");
// }
}

/**
Expand Down
169 changes: 86 additions & 83 deletions zxing/src/main/java/com/github/yoojia/zxing/camera/CameraManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,6 @@ public final class CameraManager {
private final Context mContext;

private Camera mCamera;
private FocusManager mFocusManager;

private Rect mFramingRect;

Expand All @@ -53,98 +52,90 @@ public final class CameraManager {
private int mRequestedFramingRectWidth;
private int mRequestedFramingRectHeight;

private Point mScreenResolution;
private Point mCameraResolution;
private final Point mScreenResolution = new Point();
private final Point mCameraResolution = new Point();

public CameraManager(Context context) {
this.mContext = context;
}

public FocusManager getFocusManager() {
return mFocusManager;
}

public void requestPreview(Camera.PreviewCallback callback){
mCamera.setOneShotPreviewCallback(callback);
}

public synchronized void open(SurfaceHolder holder) throws IOException {
if (mCamera == null) {
mCamera = OpenCameraInterface.open(OpenCameraInterface.NO_REQUESTED_CAMERA);
/**
* 开启相机设备
* @throws IOException 当相机设备无法启动, 或者相机已经开启时, 抛出 IOException 异常.
*/
public void open() throws IOException {
if (! isOpen()) {
mCamera = OpenCamera.open(OpenCamera.NO_REQUESTED_CAMERA);
if (mCamera == null) {
throw new IOException("Fail to open camera device !");
throw new IOException("Cannot open Camera device !");
}
initCamera();
}else {
throw new IOException("Camera was open !");
}
mCamera.setPreviewDisplay(holder);
// 设置预览方向。注意:此设置不会影响到PreviewCallback回调、及其生成的Bitmap图片的数据方向,
mCamera.setDisplayOrientation(90);
if (!mInitialized) {
mInitialized = true;
initFromCameraParameters(mCamera);
if (mRequestedFramingRectWidth > 0 && mRequestedFramingRectHeight > 0) {
setManualFramingRect(mRequestedFramingRectWidth, mRequestedFramingRectHeight);
mRequestedFramingRectWidth = 0;
mRequestedFramingRectHeight = 0;
}
}
Camera.Parameters parameters = mCamera.getParameters();
String parametersFlattened = parameters.flatten();
try {
setDesiredCameraParameters(mCamera, false);
} catch (RuntimeException re) {
// Driver failed
Log.e(TAG, "Camera rejected parameters. Setting only minimal safe-mode parameters");
Log.e(TAG, "Resetting to saved camera params: " + parametersFlattened);
// Reset:
parameters = mCamera.getParameters();
parameters.unflatten(parametersFlattened);
try {
mCamera.setParameters(parameters);
setDesiredCameraParameters(mCamera, true);
} catch (RuntimeException re2) {
// Well, darn. Give up
Log.e(TAG, "> Camera rejected even safe-mode parameters! No configuration");
}
}
}

/**
* @return 返回相机是否已开启
*/
public synchronized boolean isOpen() {
return mCamera != null;
}

/**
* 如果相机被使用,则关闭它
* 关闭相机设备
* @throws IOException 当相机设备尚未启动时, 抛出 IOException 异常.
*/
public synchronized void close() {
public void close() throws IOException {
if (isOpen()) {
mCamera.release();
mCamera = null;
mFramingRect = null;
}else {
throw new IOException("Camera is not open !");
}
}

public synchronized void startPreview(FocusEventsListener focusEventsListener) {
/**
* 设置相机预览回调接口
* @param callback 预览回调接口
*/
public void setPreviewCallback(Camera.PreviewCallback callback){
mCamera.setOneShotPreviewCallback(callback);
}

/**
* 指定相机预览SurfaceView
* @param previewHolder SurfaceView Holder
* @throws IOException
*/
public void attachPreview(SurfaceHolder previewHolder) throws IOException {
mCamera.setPreviewDisplay(previewHolder);
}

/**
* 启动相机预览
*/
public void startPreview() {
if (mCamera != null && !mPreviewing) {
mCamera.startPreview();
mPreviewing = true;
mFocusManager = new FocusManager(mCamera, focusEventsListener);
}
}

public synchronized void stopPreview() {
if (mFocusManager != null) {
mFocusManager.stopAutoFocus();
mFocusManager = null;
}
/**
* 关闭相机预览
*/
public void stopPreview() {
if (mCamera != null && mPreviewing) {
mCamera.stopPreview();
mPreviewing = false;
}
}

public Camera getCamera() {
return mCamera;
}

public boolean isOpen() {
return mCamera != null;
}

//////////////

public synchronized void setManualFramingRect(int width, int height) {
if (mInitialized) {
if (width > mScreenResolution.x) {
Expand All @@ -163,21 +154,45 @@ public synchronized void setManualFramingRect(int width, int height) {
}
}

public Camera getCamera() {
return mCamera;
private void initCamera(){
mCamera.setDisplayOrientation(90);
if (!mInitialized) {
mInitialized = true;
initFromCameraParameters(mCamera);
if (mRequestedFramingRectWidth > 0 && mRequestedFramingRectHeight > 0) {
setManualFramingRect(mRequestedFramingRectWidth, mRequestedFramingRectHeight);
mRequestedFramingRectWidth = 0;
mRequestedFramingRectHeight = 0;
}
}
Camera.Parameters parameters = mCamera.getParameters();
try {
setDesiredCameraParameters(mCamera, false);
} catch (RuntimeException e) {
// Reset:
final String resets = parameters.flatten();
Log.e(TAG, "- Camera rejected parameters. Setting only MINIMAL SAFE-MODE parameters");
Log.e(TAG, "- Resetting to saved camera params: " + resets);
parameters = mCamera.getParameters();
parameters.unflatten(resets);
try {
mCamera.setParameters(parameters);
setDesiredCameraParameters(mCamera, true);
} catch (RuntimeException ee) {
Log.e(TAG, "- Camera rejected even safe-mode parameters! NO CONFIGURATION");
}
}
}

private void initFromCameraParameters(Camera camera) {
Camera.Parameters parameters = camera.getParameters();
WindowManager manager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
Display display = manager.getDefaultDisplay();
Point theScreenResolution = new Point();
display.getSize(theScreenResolution);
mScreenResolution = theScreenResolution;
Log.i(TAG, "Screen resolution: " + mScreenResolution);
mCameraResolution = CameraConfigurationUtils.findBestPreviewSizeValue(parameters, mScreenResolution);
Log.i(TAG, "Camera resolution: " + mCameraResolution);

display.getSize(mScreenResolution);
Log.i(TAG, "- Screen resolution: " + mScreenResolution);
Point resolved = CameraConfigurationUtils.findBestPreviewSizeValue(parameters, mScreenResolution);
mCameraResolution.set(resolved.x, resolved.y);
Log.i(TAG, "- Camera resolution: " + mCameraResolution);
}

private void setDesiredCameraParameters(Camera camera, boolean safeMode) {
Expand All @@ -198,16 +213,4 @@ private void setDesiredCameraParameters(Camera camera, boolean safeMode) {
}
}

private static int findDesiredDimensionInRange(int resolution, int hardMin, int hardMax) {
int dim = 5 * resolution / 8; // Target 5/8 of each dimension
if (dim < hardMin) {
return hardMin;
}
if (dim > hardMax) {
return hardMax;
}
return dim;
}


}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
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 java.io.ByteArrayOutputStream;

final class CameraPreview {

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

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

public Bitmap capture(){
final Camera.Parameters parameters = camera.getParameters();
final int width = parameters.getPreviewSize().width;
final int height = parameters.getPreviewSize().height;
final YuvImage yuv = new YuvImage(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);
}
}
Loading

0 comments on commit fa06337

Please sign in to comment.