参考:http://blog.csdn.net/yanzi1225627/article/details/7934710
项目需求:要实现自定义拍照界面,并且只取框框中的内容。
问题点:1、通过Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)方式自动对焦,没有实现触摸对焦
2、myParameters.setPreviewSize(1280, 720) myParameters.setPictureSize(2048, 1152); 需根据机型选定,否则会报setParameters错误,尝试了设置了不同的大小,对相机界面和照片没有影响,不知道为什么?索性去掉了
效果图:
- <pre name="code" class="html"><span style="font-size:18px;">package com.emoney.camera;
- import java.io.BufferedOutputStream;
- import java.io.File;
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.text.SimpleDateFormat;
- import java.util.Date;
- import java.util.List;
- import java.util.Timer;
- import java.util.TimerTask;
- import com.stock.stock.R;
- import android.graphics.Bitmap;
- import android.graphics.BitmapFactory;
- import android.graphics.Canvas;
- import android.graphics.Matrix;
- import android.graphics.PixelFormat;
- import android.hardware.Camera;
- import android.hardware.Camera.AutoFocusCallback;
- import android.hardware.Camera.CameraInfo;
- import android.hardware.Camera.PictureCallback;
- import android.hardware.Camera.ShutterCallback;
- import android.net.Uri;
- import android.os.Bundle;
- import android.os.Environment;
- import android.app.Activity;
- import android.app.AlertDialog;
- import android.app.AlertDialog.Builder;
- import android.content.Context;
- import android.content.DialogInterface;
- import android.content.Intent;
- import android.content.pm.PackageManager;
- import android.util.Log;
- import android.view.Menu;
- import android.view.SurfaceHolder;
- import android.view.SurfaceView;
- import android.view.View;
- import android.view.Window;
- import android.view.WindowManager;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.TextView;
- import android.widget.Toast;
- public class RectCameraActivity extends Activity implements
- SurfaceHolder.Callback, OnClickListener {
- private SurfaceView mySurfaceView = null;
- private SurfaceHolder mySurfaceHolder = null;
- private CameraTopRectView topView = null; //自定义顶层view
- private Camera myCamera = null;
- private Camera.Parameters myParameters;
- private TextView takeTxt;
- private TextView cancelTxt;
- private boolean isPreviewing = false;
- private Bitmap bm;
- private static final String IMG_PATH = "SHZQ";
- private File file;
- private Uri uri;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- requestWindowFeature(Window.FEATURE_NO_TITLE);
- int flag = WindowManager.LayoutParams.FLAG_FULLSCREEN;
- Window myWindow = this.getWindow();
- myWindow.setFlags(flag, flag);
- setContentView(R.layout.my_camera_activity);
- mySurfaceView = (SurfaceView) findViewById(R.id.sv_camera);
- mySurfaceView.setZOrderOnTop(false);
- mySurfaceHolder = mySurfaceView.getHolder();
- mySurfaceHolder.setFormat(PixelFormat.TRANSLUCENT);
- mySurfaceHolder.addCallback(this);
- mySurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
- topView = (CameraTopRectView) findViewById(R.id.top_view);
- takeTxt = (TextView) findViewById(R.id.txt_take);
- cancelTxt = (TextView) findViewById(R.id.txt_cancel);
- takeTxt.setClickable(false);
- cancelTxt.setClickable(false);
- takeTxt.setOnClickListener(this);
- cancelTxt.setOnClickListener(this);
- topView.onDraw(new Canvas());
- initCamera();
- }
- @Override
- protected void onResume() {
- // TODO Auto-generated method stub
- super.onResume();
- if (myCamera == null) {
- initCamera();
- }
- }
- @Override
- protected void onPause() {
- // TODO Auto-generated method stub
- super.onPause();
- if (myCamera != null) {
- isPreviewing = false;
- takeTxt.setClickable(false);
- cancelTxt.setClickable(false);
- myCamera.release(); // release the camera for other applications
- myCamera = null;
- }
- }
- @Override
- protected void onDestroy() {
- // TODO Auto-generated method stub
- super.onDestroy();
- if(myCamera != null){
- myCamera.release();
- myCamera = null;
- }
- }
- @Override
- public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
- // TODO Auto-generated method stub
- }
- @Override
- public void surfaceCreated(SurfaceHolder holder) {
- // TODO Auto-generated method stub
- try {
- if(myCamera == null){
- return;
- }
- myCamera.setPreviewDisplay(mySurfaceHolder);
- myCamera.startPreview();
- isPreviewing = true;
- takeTxt.setClickable(true);
- cancelTxt.setClickable(true);
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- @Override
- public void surfaceDestroyed(SurfaceHolder holder) {
- // TODO Auto-generated method stub
- if(myCamera != null){
- myCamera.stopPreview();
- myCamera.release();
- myCamera = null;
- }
- }
- ShutterCallback myShutterCallback = new ShutterCallback() {
- public void onShutter() {
- // TODO Auto-generated method stub
- }
- };
- PictureCallback myRawCallback = new PictureCallback() {
- public void onPictureTaken(byte[] data, Camera camera) {
- // TODO Auto-generated method stub
- }
- };
- PictureCallback myjpegCalback = new PictureCallback() {
- public void onPictureTaken(byte[] data, Camera camera) {
- // TODO Auto-generated method stub
- if (data != null) {
- Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0,
- data.length);
- // myCamera.stopPreview();
- // myCamera.release();
- // myCamera = null;
- isPreviewing = false;
- takeTxt.setText("确定");
- Bitmap sizeBitmap = Bitmap.createScaledBitmap(bitmap,
- topView.getViewWidth(), topView.getViewHeight(), true);
- bm = Bitmap.createBitmap(sizeBitmap, topView.getRectLeft(),
- topView.getRectTop(),
- topView.getRectRight() - topView.getRectLeft(),
- topView.getRectBottom() - topView.getRectTop());// 截取
- }
- }
- };
- // 初始化摄像头
- public void initCamera() {
- if (myCamera == null) {
- myCamera = getCameraInstance();
- }
- if (myCamera != null) {
- myParameters = myCamera.getParameters();
- myParameters.setPictureFormat(PixelFormat.JPEG);
- myParameters.set("rotation", 90);
- if (getCameraFocusable() != null) {
- myParameters.setFocusMode(getCameraFocusable());
- }
- // myParameters.setPreviewSize(1280, 720);
- // myParameters.setPictureSize(2048, 1152); // 1280, 720
- myCamera.setDisplayOrientation(90);
- myCamera.setParameters(myParameters);
- } else {
- Toast.makeText(this, "相机错误!", Toast.LENGTH_SHORT).show();
- }
- }
- @Override
- public void onClick(View v) {
- if (v == null) {
- return;
- }
- switch (v.getId()) {
- case R.id.txt_take:
- if(CommonUtils.isFastDoubleClick())return;
- if (isPreviewing) {
- // 拍照
- myCamera.takePicture(myShutterCallback, myRawCallback,
- myjpegCalback);
- } else {
- // 保存图片
- File file = getOutputMediaFile();
- this.file = file;
- this.uri = Uri.fromFile(file);
- if (file != null && bm != null) {
- FileOutputStream fout;
- try {
- fout = new FileOutputStream(file);
- BufferedOutputStream bos = new BufferedOutputStream(
- fout);
- // Bitmap mBitmap = Bitmap.createScaledBitmap(bm,
- // topView.getViewWidth(), topView.getViewHeight(),
- // false);
- bm.compress(Bitmap.CompressFormat.JPEG, 100, bos);
- // bm.compress(Bitmap.CompressFormat.JPEG, 100, bos);
- bos.flush();
- bos.close();
- } catch (FileNotFoundException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- //返回数据
- Intent intent = new Intent();
- intent.setData(uri);
- Bundle bundle = new Bundle();
- intent.putExtras(bundle);
- setResult(0x1001, intent);
- }
- finish();
- }
- break;
- case R.id.txt_cancel:
- if(CommonUtils.isFastDoubleClick())return;
- if (isPreviewing) {
- finish();
- // 退出相机
- } else {
- if(myCamera == null){
- initCamera();
- }
- // 重新拍照
- try {
- myCamera.setPreviewDisplay(mySurfaceHolder);
- myCamera.startPreview();
- isPreviewing = true;
- takeTxt.setText("拍照");
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- break;
- default:
- break;
- }
- }
- private String getCameraFocusable() {
- List<String> focusModes = myParameters.getSupportedFocusModes();
- if (focusModes
- .contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)) {
- return Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE;
- } else if (focusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO)) {
- return Camera.Parameters.FOCUS_MODE_AUTO;
- }
- return null;
- }
- /** A safe way to get an instance of the Camera object. */
- public Camera getCameraInstance() {
- Camera c = null;
- try {
- if (getCameraId() >= 0) {
- c = Camera.open(getCameraId()); // attempt to get a Camera
- // instance
- } else {
- return null;
- }
- } catch (Exception e) {
- // Camera is not available (in use or does not exist)
- Log.e("getCameraInstance", e.toString());
- }
- return c; // returns null if camera is unavailable
- }
- private int getCameraId() {
- if (!checkCameraHardware(this)) {
- return -1;
- }
- int cNum = Camera.getNumberOfCameras();
- int defaultCameraId = -1;
- CameraInfo cameraInfo = new CameraInfo();
- for (int i = 0; i < cNum; i++) {
- Camera.getCameraInfo(i, cameraInfo);
- if (cameraInfo.facing == CameraInfo.CAMERA_FACING_BACK) {
- defaultCameraId = i;
- }
- }
- return defaultCameraId;
- }
- /** Check if this device has a camera */
- private boolean checkCameraHardware(Context context) {
- if (context.getPackageManager().hasSystemFeature(
- PackageManager.FEATURE_CAMERA)) {
- return true;
- } else {
- return false;
- }
- }
- /** Create a File for saving an image or video */
- private File getOutputMediaFile() {
- File mediaStorageDir = null;
- if (android.os.Environment.getExternalStorageState().equals(
- android.os.Environment.MEDIA_MOUNTED)) {
- mediaStorageDir = new File(
- Environment
- .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
- IMG_PATH);
- if (!mediaStorageDir.exists()) {
- if (!mediaStorageDir.mkdirs()) {
- return null;
- }
- }
- } else {
- Toast.makeText(this, "没有sd卡", Toast.LENGTH_SHORT).show();
- return null;
- }
- String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss")
- .format(new Date());
- File mediaFile = new File(mediaStorageDir.getPath() + File.separator
- + "IMG_" + timeStamp + ".jpg");
- return mediaFile;
- }
- }</span>
- <span style="font-size:18px;">package com.emoney.camera;
- import android.app.Activity;
- import android.content.Context;
- import android.graphics.Canvas;
- import android.graphics.Color;
- import android.graphics.Paint;
- import android.graphics.Paint.FontMetricsInt;
- import android.graphics.Paint.Style;
- import android.graphics.Rect;
- import android.graphics.RectF;
- import android.util.AttributeSet;
- import android.view.View;
- public class CameraTopRectView extends View {
- private int panelWidth;
- private int panelHeght;
- private int viewWidth;
- private int viewHeight;
- private int rectWidth;
- private int rectHeght;
- private int rectTop;
- private int rectLeft;
- private int rectRight;
- private int rectBottom;
- private int lineLen;
- private int lineWidht;
- private static final int LINE_WIDTH = 5;
- private static final int TOP_BAR_HEIGHT = 50;
- private static final int BOTTOM_BTN_HEIGHT = 66;
- private static final int LEFT_PADDING = 10;
- private static final int RIGHT_PADDING = 10;
- private static final String TIPS = "请将身份证放入到方框中";
- private Paint linePaint;
- private Paint wordPaint;
- private Rect rect;
- private int baseline;
- public CameraTopRectView(Context context, AttributeSet attrs) {
- super(context, attrs);
- // TODO Auto-generated constructor stub
- Activity activity = (Activity) context;
- panelWidth = UnitUtils.getDisplayWidth(activity);
- panelHeght = UnitUtils.getDisplayHeight(activity);
- viewHeight = panelHeght
- - UnitUtils.getInstance(activity).dip2px(
- TOP_BAR_HEIGHT + BOTTOM_BTN_HEIGHT);
- viewWidth = panelWidth;
- rectWidth = panelWidth
- - UnitUtils.getInstance(activity).dip2px(
- LEFT_PADDING + RIGHT_PADDING);
- rectHeght = (int) (rectWidth * 54 / 85.6);
- // 相对于此view
- rectTop = (viewHeight - rectHeght) / 2;
- rectLeft = (viewWidth - rectWidth) / 2;
- rectBottom = rectTop + rectHeght;
- rectRight = rectLeft + rectWidth;
- lineLen = panelWidth / 8;
- linePaint = new Paint();
- linePaint.setAntiAlias(true);
- linePaint.setColor(Color.rgb(0xdd, 0x42, 0x2f));
- linePaint.setStyle(Style.STROKE);
- linePaint.setStrokeWidth(LINE_WIDTH);// 设置线宽
- linePaint.setAlpha(255);
- wordPaint = new Paint();
- wordPaint.setAntiAlias(true);
- wordPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
- wordPaint.setStrokeWidth(3);
- wordPaint.setTextSize(35);
- rect = new Rect(rectLeft, rectTop - 80, rectRight, rectTop - 10);
- FontMetricsInt fontMetrics = wordPaint.getFontMetricsInt();
- baseline = rect.top
- + (rect.bottom - rect.top - fontMetrics.bottom + fontMetrics.top)
- / 2 - fontMetrics.top;
- wordPaint.setTextAlign(Paint.Align.CENTER);
- }
- @Override
- protected void onDraw(Canvas canvas) {
- // TODO Auto-generated method stub
- super.onDraw(canvas);
- wordPaint.setColor(Color.TRANSPARENT);
- canvas.drawRect(rect, wordPaint);
- wordPaint.setColor(Color.BLACK);
- canvas.drawText(TIPS, rect.centerX(), baseline, wordPaint);
- canvas.drawLine(rectLeft, rectTop, rectLeft + lineLen, rectTop,
- linePaint);
- canvas.drawLine(rectRight - lineLen, rectTop, rectRight, rectTop,
- linePaint);
- canvas.drawLine(rectLeft, rectTop, rectLeft, rectTop + lineLen,
- linePaint);
- canvas.drawLine(rectRight, rectTop, rectRight, rectTop + lineLen,
- linePaint);
- canvas.drawLine(rectLeft, rectBottom, rectLeft + lineLen, rectBottom,
- linePaint);
- canvas.drawLine(rectRight - lineLen, rectBottom, rectRight, rectBottom,
- linePaint);
- canvas.drawLine(rectLeft, rectBottom - lineLen, rectLeft, rectBottom,
- linePaint);
- canvas.drawLine(rectRight, rectBottom - lineLen, rectRight, rectBottom,
- linePaint);
- }
- public int getRectLeft() {
- return rectLeft;
- }
- public int getRectTop() {
- return rectTop;
- }
- public int getRectRight() {
- return rectRight;
- }
- public int getRectBottom() {
- return rectBottom;
- }
- public int getViewWidth() {
- return viewWidth;
- }
- public int getViewHeight() {
- return viewHeight;
- }
- }
- </span>