package org.zhx.view.camera.ui;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Context;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.ImageFormat;
import android.graphics.Matrix;
import android.graphics.Point;
import android.graphics.Rect;
import android.hardware.Camera;
import android.hardware.Camera.AutoFocusCallback;
import android.hardware.Camera.Parameters;
import android.hardware.Camera.PictureCallback;
import android.os.Build;
import android.os.Environment;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import org.zhx.view.R;
import org.zhx.view.camera.util.DisplayUtil;
import org.zhx.view.camera.widget.OverlayView;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
public class ZCameraBaseAcitivy extends Activity implements Callback, OnClickListener {
private static final String TAG = ZCameraBaseAcitivy.class.getSimpleName();
public static BitmapFactory.Options opt;
static {
// 缩小原图片大小
opt = new BitmapFactory.Options();
opt.inSampleSize = 2;
}
private SurfaceView surfaceView;
private SurfaceHolder mHolder;
private Camera mCamera;
private boolean isPreview = false;
private Point displayPx;
private ImageView tpImg, showImg;
private Button saveBtn;
// 取景框
private OverlayView overlayView;
private Rect rect;
private boolean isTake = false;
private String[] flashMedols = {Parameters.FLASH_MODE_AUTO, Parameters.FLASH_MODE_ON, Parameters.FLASH_MODE_OFF, Parameters.FLASH_MODE_TORCH};
private int[] modelResId = {R.drawable.ic_launcher, R.drawable.ic_launcher, R.drawable.ic_launcher, R.drawable.ic_launcher};
/**
* 切换摄像头
*/
private ImageView swImg;
private ImageView flashModelImg;
/**
* 当前是否是前置摄像头
*/
private boolean isFrontCamera = false;
int modelIndex = 0;
protected void onCreate(android.os.Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
displayPx = DisplayUtil.getScreenMetrics(this);
surfaceView = (SurfaceView) findViewById(R.id.z_base_camera_preview);
tpImg = (ImageView) findViewById(R.id.z_take_pictrue_img);
saveBtn = (Button) findViewById(R.id.z_base_camera_save);
showImg = (ImageView) findViewById(R.id.z_base_camera_showImg);
overlayView = (OverlayView) findViewById(R.id.z_base_camera_over_img);
swImg = (ImageView) findViewById(R.id.btn_switch_camera);
swImg.setOnClickListener(this);
flashModelImg = (ImageView) findViewById(R.id.btn_flash_mode);
flashModelImg.setOnClickListener(this);
// 设置取景框的 magin 这里最好 将 这些从dp 转化为px; 距 左 、上 、右、下的 距离 单位是dp
rect = DisplayUtil.createCenterScreenRect(this, new Rect(50, 200, 50, 200));// 取景框的大小
overlayView.setmCenterRect(rect);
saveBtn.setOnClickListener(this);
showImg.setOnClickListener(this);
tpImg.setOnClickListener(this);
mHolder = surfaceView.getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
openCamera();
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
if (mCamera != null) {
if (isPreview) {
mCamera.stopPreview();
mCamera.release();
mCamera = null;
isPreview = false;
}
}
}
@Override
protected void onRestart() {
// TODO Auto-generated method stub
super.onRestart();
initCamera();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
// TODO Auto-generated method stub
initCamera();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
// 当holder被回收时 释放硬件
releaseCamera();
}
private void releaseCamera() {
if (mCamera != null) {
if (isPreview) {
mCamera.stopPreview();
}
mCamera.release();
mCamera = null;
}
isPreview = false;
}
private void switchCamera() throws Exception {
isFrontCamera = !isFrontCamera;
releaseCamera();
openCamera();
initCamera();
}
@TargetApi(Build.VERSION_CODES.GINGERBREAD)
private void openCamera() {
if (!isFrontCamera) {
mCamera = Camera.open();
} else {
Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
for (int i = 0; i < Camera.getNumberOfCameras(); i++) {
Camera.getCameraInfo(i, cameraInfo);
{
if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
mCamera = Camera.open(i);
isFrontCamera = true;
}
}
}
}
}
/**
*/
public void initCamera() {
if (mCamera != null && !isPreview) {
try {
Camera.Parameters parameters = mCamera.getParameters();
// 设置闪光灯为自动 前置摄像头时 不能设置
if (!isFrontCamera) {
parameters.setFlashMode(Parameters.FLASH_MODE_AUTO);
}
resetCameraSize(parameters);
// 设置图片格式
parameters.setPictureFormat(ImageFormat.JPEG);
// 设置JPG照片的质量
parameters.set("jpeg-quality", 100);
// 通过SurfaceView显示取景画面
mCamera.setPreviewDisplay(mHolder);
// 开始预览
mCamera.startPreview();
} catch (IOException e) {
e.printStackTrace();
}
isPreview = true;
}
}
/**
* 旋转相机和设置预览大小
*/
public void resetCameraSize(Parameters parameters) {
if (this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE) {
mCamera.setDisplayOrientation(90);
} else {
mCamera.setDisplayOrientation(0);
}
List<Camera.Size> sizeList = parameters.getSupportedPreviewSizes();
if (sizeList.size() > 0) {
Camera.Size cameraSize = sizeList.get(0);
// 设置预览图片大小 为设备长宽
parameters.setPreviewSize(cameraSize.width, cameraSize.height);
}
sizeList = parameters.getSupportedPictureSizes();
if (sizeList.size() > 0) {
Camera.Size cameraSize = sizeList.get(0);
for (Camera.Size size : sizeList) {
if (size.width * size.height == displayPx.x * displayPx.y) {
cameraSize = size;
break;
}
}
// 设置图