package com.andbase.demo.camera;
import android.content.Context;
import android.graphics.Point;
import android.graphics.Rect;
import android.hardware.Camera;
import android.hardware.Camera.Parameters;
import android.util.Log;
import android.view.SurfaceHolder;
import java.io.IOException;
public final class CameraManager {
private static final String TAG = CameraManager.class.getSimpleName();
private static CameraManager cameraManager;
private final CameraConfigurationManager configManager;
private Camera camera;
private Rect framingRect;
private boolean initialized;
private boolean previewing = false;
private Camera.AutoFocusCallback autoFocusCallback;
private Camera.PreviewCallback previewCallback;
private Camera.PictureCallback pictureCallback;
public static void init(Context context) {
if (cameraManager == null) {
cameraManager = new CameraManager(context);
}
}
public static CameraManager get() {
return cameraManager;
}
private CameraManager(Context context) {
this.configManager = new CameraConfigurationManager(context);
}
/**
* 打开相机
*
* @param holder
* @param cameraID
* @throws IOException
*/
public void openDriver(SurfaceHolder holder, int cameraID)
throws IOException {
if (camera == null) {
camera = Camera.open(cameraID);
if (camera == null) {
throw new IOException();
}
if(holder!=null){
camera.setPreviewDisplay(holder);
}
//
if (Config.orientation == 1) {
camera.setDisplayOrientation(90);
}
if (!initialized) {
configManager.initFromCameraParameters(camera);
initialized = true;
}
// 设置预览参数
configManager.setDesiredCameraParameters(camera,cameraID);
}
}
/**
* 关闭
*/
public void closeDriver() {
if (camera != null) {
camera.setPreviewCallback(null);
camera.release();
camera = null;
}
}
/**
* 开始预览
*/
public void startPreview() {
if (camera != null && !previewing) {
Log.e("Camera", "相机开始预览");
if(previewCallback!=null){
camera.setPreviewCallback(previewCallback);
}
camera.startPreview();
previewing = true;
if(Config.focusMode==0){
requestAutoFocus();
}else{
camera.cancelAutoFocus();
}
}else{
if(Config.focusMode == 0) {
this.requestAutoFocus();
}
}
}
/**
* 停止预览
*/
public void stopPreview() {
if (camera != null && previewing) {
Log.e("Camera", "相机停止预览");
camera.setPreviewCallback(null);
camera.stopPreview();
previewing = false;
}
}
/**
* 开始对焦
*/
public void requestAutoFocus() {
try {
if (camera != null && previewing) {
camera.autoFocus(autoFocusCallback);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public Rect getFramingRect() {
// 1280x720 Point(864, 480)
// 身份证是80x55
Point cameraResolution = configManager.getCameraResolution();
if (camera == null) {
return null;
}
float b = 85.0f / 55;
int x;
int y;
//竖屏
if (Config.orientation == 1) {
if(cameraResolution.x < cameraResolution.y){
x = cameraResolution.x;
y = cameraResolution.y;
}else{
x = cameraResolution.y;
y = cameraResolution.x;
}
}else{
if(cameraResolution.x > cameraResolution.y){
x = cameraResolution.x;
y = cameraResolution.y;
}else{
x = cameraResolution.y;
y = cameraResolution.x;
}
}
float height = y*8/10;
float width = height*b;
float leftOffset = (x - width) / 2.0f;
float topOffset = (y - height) / 2.0f;
framingRect = new Rect((int) leftOffset, (int) topOffset,
(int) (leftOffset + width), (int) (topOffset + height));
return framingRect;
}
/**
*
* 获取选定窗口.
* @return
*/
public Rect getTargetRect() {
return framingRect;
}
/**
* 拍照
*/
public void takePicture() {
camera.takePicture(null, null, this.pictureCallback);
}
/**
* 闪光灯
*/
public void toogleFlash() {
Parameters parameters = camera.getParameters();
if(parameters.getFlashMode().equals(Parameters.FLASH_MODE_OFF)){
parameters.setFlashMode(Parameters.FLASH_MODE_TORCH);
}else{
parameters.setFlashMode(Parameters.FLASH_MODE_OFF);
}
camera.setParameters(parameters);
}
public Camera getCamera() {
if (camera != null) {
return camera;
}
return null;
}
public CameraConfigurationManager getConfigManager() {
return this.configManager;
}
public Point getPreviewSize() {
return configManager.getCameraResolution();
}
public Point getPictureSize() {
return configManager.getPictureResolution();
}
public Point getScreenResolution() {
return configManager.getScreenResolution();
}
public Camera.AutoFocusCallback getAutoFocusCallback() {
return autoFocusCallback;
}
public void setAutoFocusCallback(Camera.AutoFocusCallback autoFocusCallback) {
this.autoFocusCallback = autoFocusCallback;
}
public Camera.PreviewCallback getPreviewCallback() {
return previewCallback;
}
public void setPreviewCallback(Camera.PreviewCallback previewCallback) {
this.previewCallback = previewCallback;
}
public Camera.PictureCallback getPictureCallback() {
return pictureCallback;
}
public void setPictureCallback(Camera.PictureCallback pictureCallback) {
this.pictureCallback = pictureCallback;
}
}