package me.zhouzhuo810.cameracardcrop; import android.content.Context; import android.hardware.Camera; import android.util.AttributeSet; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView; import java.io.IOException; import java.util.List; import me.zhouzhuo810.cameracardcrop.manager.AutoFocusManager; /** * Preview of camera * Created by zhouzhuo810 on 2017/6/15. */ public class CameraView extends SurfaceView implements SurfaceHolder.Callback { private Camera mCamera; private AutoFocusManager autoFocusManager; private boolean released; public CameraView(Context context, Camera camera) { super(context); mCamera = camera; getHolder().addCallback(this); getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); try { initCamera(mCamera); } catch (Exception e) { e.printStackTrace(); } } private void initCamera(Camera camera) throws Exception{ Camera.Parameters parameters = camera.getParameters(); List<Camera.Size> previewSizes = parameters.getSupportedPreviewSizes(); for (Camera.Size size : previewSizes) { // Log.e("XXX", "preview:"+size.width+","+size.height); if (size.width / 16 == size.height / 9) { parameters.setPreviewSize(size.width, size.height); break; } } List<Camera.Size> pictureSizes = parameters.getSupportedPictureSizes(); for (Camera.Size size : pictureSizes) { // Log.e("XXX", "picture:"+size.width+","+size.height); if (size.width / 16 == size.height / 9) { parameters.setPictureSize(size.width, size.height); break; } } Camera.CameraInfo info = new Camera.CameraInfo(); Camera.getCameraInfo(CameraUtils.findCameraId(false), info); int rotation = info.orientation % 360; // Log.d("XXX", "Rotation :"+rotation); parameters.setRotation(rotation); camera.setDisplayOrientation(90); parameters.setJpegQuality(100); camera.setParameters(parameters); } public CameraView(Context context, AttributeSet attrs) { super(context, attrs); } public CameraView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } public boolean isReleased() { return released; } public void setReleased(boolean released) { this.released = released; } @Override public void surfaceCreated(SurfaceHolder holder) { try { mCamera.setPreviewDisplay(holder); mCamera.startPreview(); if (autoFocusManager == null) { autoFocusManager = new AutoFocusManager(mCamera); } } catch (IOException e) { e.printStackTrace(); } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { if (getHolder().getSurface() == null) { return; } try { mCamera.stopPreview(); if (autoFocusManager != null) { autoFocusManager.stop(released); autoFocusManager = null; } } catch (Exception e) { } try { initCamera(mCamera); } catch (Exception e) { e.printStackTrace(); } try { mCamera.setPreviewDisplay(holder); mCamera.startPreview(); if (autoFocusManager == null) { autoFocusManager = new AutoFocusManager(mCamera); } } catch (IOException e) { e.printStackTrace(); } } @Override public void surfaceDestroyed(SurfaceHolder holder) { if (autoFocusManager != null) { autoFocusManager.stop(released); autoFocusManager = null; } } }