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<Hscale)?Wscale:Hscale; 
 | 
              if(CardScreenUtil.getScreenOrientation(getContext())==CardScreenUtil.ORIENTATION_PORTRAIT){ 
 | 
                 ViewfinderView.portraitWidth=(int)(mCameraConfigurationManager.getCameraResolution().x/scale); 
 | 
              } 
 | 
            return scale; 
 | 
        } 
 | 
        return scale; 
 | 
    } 
 | 
  
 | 
    public float getHscale(){ 
 | 
        float Hscale=((float)mCameraConfigurationManager.getCameraResolution().y /(float) CardScreenUtil.getScreenResolution(getContext()).y); 
 | 
        return Hscale; 
 | 
    } 
 | 
  
 | 
  
 | 
} 
 |