package com.kernal.passportreader.sdk.view; import android.content.Context; import android.content.pm.PackageManager; import android.graphics.Point; import android.hardware.Camera; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView; import com.kernal.passportreader.sdk.utils.CameraConfigurationManager; import com.kernal.passportreader.sdk.utils.CardScreenUtil; /** * @author A@H * @describle 自定义预览View,主要是相机预览的开启与关闭,对焦方式以及闪光灯 */ public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback { private static final String TAG = CameraPreview.class.getSimpleName(); private Camera mCamera; private boolean mPreviewing = true; private boolean mSurfaceCreated = false; private Camera.PreviewCallback mpreviewCallback; private CameraConfigurationManager mCameraConfigurationManager; public CameraPreview(Context context) { super(context); } public void setCamera(Camera camera, Camera.PreviewCallback previewCallback) { mCamera = camera; mpreviewCallback=previewCallback; if (mCamera != null) { mCameraConfigurationManager = new CameraConfigurationManager(getContext()); mCameraConfigurationManager.initFromCameraParameters(mCamera); getHolder().addCallback(this); if (mPreviewing) { requestLayout(); } else { showCameraPreview(); } } } @Override public void surfaceCreated(SurfaceHolder surfaceHolder) { mSurfaceCreated = true; } @Override public void surfaceChanged(SurfaceHolder surfaceHolder, int format, int width, int height) { if (surfaceHolder.getSurface() == null) { return; } stopCameraPreview(); post(new Runnable() { @Override public void run() { showCameraPreview(); } }); } @Override public void surfaceDestroyed(SurfaceHolder surfaceHolder) { mSurfaceCreated = false; stopCameraPreview(); } public void showCameraPreview() { if (mCamera != null) { try { mPreviewing = true; mCamera.setPreviewDisplay(getHolder()); mCameraConfigurationManager.setDesiredCameraParameters(mCamera); mCamera.setOneShotPreviewCallback(mpreviewCallback); mCamera.startPreview(); mCamera.autoFocus(autoFocusCB); } catch (Exception e) { Log.e(TAG, e.toString(), e); } } } public void stopCameraPreview() { if (mCamera != null) { try { removeCallbacks(doAutoFocus); mPreviewing = false; mCamera.cancelAutoFocus(); mCamera.setOneShotPreviewCallback(null); mCamera.stopPreview(); } catch (Exception e) { Log.e(TAG, e.toString(), e); } } } public void openFlashlight() { if (flashLightAvailable()) { mCameraConfigurationManager.openFlashlight(mCamera); } } public void closeFlashlight() { if (flashLightAvailable()) { mCameraConfigurationManager.closeFlashlight(mCamera); } } @Override public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int width = getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec); int height = getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec); if (mCameraConfigurationManager != null && mCameraConfigurationManager.getCameraResolution() != null) { Point cameraResolution = mCameraConfigurationManager.getCameraResolution(); // 取出来的cameraResolution高宽值与屏幕的高宽顺序是相反的 int cameraPreviewWidth = cameraResolution.x; int cameraPreviewHeight = cameraResolution.y; if (width * 1f / height < cameraPreviewWidth * 1f / cameraPreviewHeight) { float ratio = cameraPreviewHeight * 1f / cameraPreviewWidth; width = (int) (height / ratio + 0.5f); } else { float ratio = cameraPreviewWidth * 1f / cameraPreviewHeight; height = (int) (width / ratio + 0.5f); } } super.onMeasure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY)); } private boolean flashLightAvailable() { return mCamera != null && mPreviewing && mSurfaceCreated && getContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH); } private Runnable doAutoFocus = new Runnable() { @Override public void run() { if (mCamera != null && mPreviewing && mSurfaceCreated) { try { mCamera.autoFocus(autoFocusCB); } catch (Exception e) { } } } }; Camera.AutoFocusCallback autoFocusCB = new Camera.AutoFocusCallback() { @Override public void onAutoFocus(boolean success, Camera camera) { if (success) { postDelayed(doAutoFocus, 1500); } else { postDelayed(doAutoFocus, 500); } } }; public Point getPreViewSize() { if (mCameraConfigurationManager != null) { return mCameraConfigurationManager.getmPreviewResolution(); } return null; } public float getScale() { float scale=1.0f; if (mCameraConfigurationManager != null) { float width=0; float height=0; if(ViewfinderView.width==0||ViewfinderView.height==0){ width=(float)CardScreenUtil.getScreenResolution(getContext()).x; height=(float)CardScreenUtil.getScreenResolution(getContext()).y; }else{ width=ViewfinderView.width; height=ViewfinderView.height; } float Wscale=((float)mCameraConfigurationManager.getCameraResolution().x /width); float Hscale=((float)mCameraConfigurationManager.getCameraResolution().y /height); scale=(Wscale