Android自定义相机,带边框截图

参考: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错误,尝试了设置了不同的大小,对相机界面和照片没有影响,不知道为什么?索性去掉了

效果图:



[java]  view plain  copy
  1. <pre name="code" class="html"><span style="font-size:18px;">package com.emoney.camera;  
  2.   
  3. import java.io.BufferedOutputStream;  
  4. import java.io.File;  
  5. import java.io.FileNotFoundException;  
  6. import java.io.FileOutputStream;  
  7. import java.io.IOException;  
  8. import java.text.SimpleDateFormat;  
  9. import java.util.Date;  
  10. import java.util.List;  
  11. import java.util.Timer;  
  12. import java.util.TimerTask;  
  13.   
  14. import com.stock.stock.R;  
  15.   
  16. import android.graphics.Bitmap;  
  17. import android.graphics.BitmapFactory;  
  18. import android.graphics.Canvas;  
  19. import android.graphics.Matrix;  
  20. import android.graphics.PixelFormat;  
  21. import android.hardware.Camera;  
  22. import android.hardware.Camera.AutoFocusCallback;  
  23. import android.hardware.Camera.CameraInfo;  
  24. import android.hardware.Camera.PictureCallback;  
  25. import android.hardware.Camera.ShutterCallback;  
  26. import android.net.Uri;  
  27. import android.os.Bundle;  
  28. import android.os.Environment;  
  29. import android.app.Activity;  
  30. import android.app.AlertDialog;  
  31. import android.app.AlertDialog.Builder;  
  32. import android.content.Context;  
  33. import android.content.DialogInterface;  
  34. import android.content.Intent;  
  35. import android.content.pm.PackageManager;  
  36. import android.util.Log;  
  37. import android.view.Menu;  
  38. import android.view.SurfaceHolder;  
  39. import android.view.SurfaceView;  
  40. import android.view.View;  
  41. import android.view.Window;  
  42. import android.view.WindowManager;  
  43. import android.view.View.OnClickListener;  
  44. import android.widget.Button;  
  45. import android.widget.TextView;  
  46. import android.widget.Toast;  
  47.   
  48. public class RectCameraActivity extends Activity implements  
  49.         SurfaceHolder.Callback, OnClickListener {  
  50.   
  51.     private SurfaceView mySurfaceView = null;  
  52.     private SurfaceHolder mySurfaceHolder = null;  
  53.     private CameraTopRectView topView = null//自定义顶层view  
  54.   
  55.     private Camera myCamera = null;  
  56.     private Camera.Parameters myParameters;  
  57.   
  58.     private TextView takeTxt;  
  59.     private TextView cancelTxt;  
  60.   
  61.     private boolean isPreviewing = false;  
  62.     private Bitmap bm;  
  63.     private static final String IMG_PATH = "SHZQ";  
  64.     private File file;  
  65.     private Uri uri;  
  66.   
  67.     @Override  
  68.     protected void onCreate(Bundle savedInstanceState) {  
  69.         super.onCreate(savedInstanceState);  
  70.         requestWindowFeature(Window.FEATURE_NO_TITLE);  
  71.         int flag = WindowManager.LayoutParams.FLAG_FULLSCREEN;  
  72.         Window myWindow = this.getWindow();  
  73.         myWindow.setFlags(flag, flag);  
  74.   
  75.         setContentView(R.layout.my_camera_activity);  
  76.         mySurfaceView = (SurfaceView) findViewById(R.id.sv_camera);  
  77.         mySurfaceView.setZOrderOnTop(false);  
  78.         mySurfaceHolder = mySurfaceView.getHolder();  
  79.         mySurfaceHolder.setFormat(PixelFormat.TRANSLUCENT);  
  80.         mySurfaceHolder.addCallback(this);  
  81.         mySurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);  
  82.   
  83.         topView = (CameraTopRectView) findViewById(R.id.top_view);  
  84.         takeTxt = (TextView) findViewById(R.id.txt_take);  
  85.         cancelTxt = (TextView) findViewById(R.id.txt_cancel);  
  86.         takeTxt.setClickable(false);  
  87.         cancelTxt.setClickable(false);  
  88.         takeTxt.setOnClickListener(this);  
  89.         cancelTxt.setOnClickListener(this);  
  90.   
  91.         topView.onDraw(new Canvas());  
  92.         initCamera();  
  93.     }  
  94.   
  95.     @Override  
  96.     protected void onResume() {  
  97.         // TODO Auto-generated method stub  
  98.         super.onResume();  
  99.         if (myCamera == null) {  
  100.             initCamera();  
  101.         }  
  102.     }  
  103.   
  104.     @Override  
  105.     protected void onPause() {  
  106.         // TODO Auto-generated method stub  
  107.         super.onPause();  
  108.         if (myCamera != null) {  
  109.             isPreviewing = false;  
  110.             takeTxt.setClickable(false);  
  111.             cancelTxt.setClickable(false);  
  112.             myCamera.release(); // release the camera for other applications  
  113.             myCamera = null;  
  114.         }  
  115.     }  
  116.       
  117.     @Override  
  118.     protected void onDestroy() {  
  119.         // TODO Auto-generated method stub  
  120.         super.onDestroy();  
  121.         if(myCamera != null){  
  122.             myCamera.release();  
  123.             myCamera = null;  
  124.         }  
  125.     }  
  126.   
  127.     @Override  
  128.     public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {  
  129.         // TODO Auto-generated method stub  
  130.   
  131.     }  
  132.   
  133.     @Override  
  134.     public void surfaceCreated(SurfaceHolder holder) {  
  135.         // TODO Auto-generated method stub  
  136.         try {  
  137.             if(myCamera == null){  
  138.                 return;  
  139.             }  
  140.             myCamera.setPreviewDisplay(mySurfaceHolder);  
  141.             myCamera.startPreview();  
  142.             isPreviewing = true;  
  143.             takeTxt.setClickable(true);  
  144.             cancelTxt.setClickable(true);  
  145.         } catch (IOException e) {  
  146.             // TODO Auto-generated catch block  
  147.             e.printStackTrace();  
  148.         }  
  149.     }  
  150.   
  151.     @Override  
  152.     public void surfaceDestroyed(SurfaceHolder holder) {  
  153.         // TODO Auto-generated method stub  
  154.         if(myCamera != null){  
  155.             myCamera.stopPreview();  
  156.             myCamera.release();  
  157.             myCamera = null;  
  158.         }  
  159.   
  160.     }  
  161.   
  162.     ShutterCallback myShutterCallback = new ShutterCallback() {  
  163.   
  164.         public void onShutter() {  
  165.             // TODO Auto-generated method stub  
  166.   
  167.         }  
  168.     };  
  169.     PictureCallback myRawCallback = new PictureCallback() {  
  170.   
  171.         public void onPictureTaken(byte[] data, Camera camera) {  
  172.             // TODO Auto-generated method stub  
  173.   
  174.         }  
  175.     };  
  176.     PictureCallback myjpegCalback = new PictureCallback() {  
  177.   
  178.         public void onPictureTaken(byte[] data, Camera camera) {  
  179.             // TODO Auto-generated method stub  
  180.             if (data != null) {  
  181.                 Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0,  
  182.                         data.length);  
  183. //              myCamera.stopPreview();  
  184. //              myCamera.release();  
  185. //              myCamera = null;  
  186.                 isPreviewing = false;  
  187.                 takeTxt.setText("确定");  
  188.   
  189.                 Bitmap sizeBitmap = Bitmap.createScaledBitmap(bitmap,  
  190.                         topView.getViewWidth(), topView.getViewHeight(), true);  
  191.                 bm = Bitmap.createBitmap(sizeBitmap, topView.getRectLeft(),  
  192.                         topView.getRectTop(),  
  193.                         topView.getRectRight() - topView.getRectLeft(),  
  194.                         topView.getRectBottom() - topView.getRectTop());// 截取  
  195.             }  
  196.         }  
  197.     };  
  198.   
  199.     // 初始化摄像头  
  200.     public void initCamera() {  
  201.         if (myCamera == null) {  
  202.             myCamera = getCameraInstance();  
  203.         }  
  204.         if (myCamera != null) {  
  205.             myParameters = myCamera.getParameters();  
  206.             myParameters.setPictureFormat(PixelFormat.JPEG);  
  207.             myParameters.set("rotation"90);  
  208.             if (getCameraFocusable() != null) {  
  209.                 myParameters.setFocusMode(getCameraFocusable());  
  210.             }  
  211. //          myParameters.setPreviewSize(1280, 720);  
  212. //          myParameters.setPictureSize(2048, 1152); // 1280, 720  
  213.   
  214.             myCamera.setDisplayOrientation(90);  
  215.             myCamera.setParameters(myParameters);  
  216.         } else {  
  217.             Toast.makeText(this"相机错误!", Toast.LENGTH_SHORT).show();  
  218.         }  
  219.   
  220.     }  
  221.   
  222.     @Override  
  223.     public void onClick(View v) {  
  224.         if (v == null) {  
  225.             return;  
  226.         }  
  227.         switch (v.getId()) {  
  228.         case R.id.txt_take:  
  229.             if(CommonUtils.isFastDoubleClick())return;  
  230.             if (isPreviewing) {  
  231.                 // 拍照  
  232.                 myCamera.takePicture(myShutterCallback, myRawCallback,  
  233.                         myjpegCalback);  
  234.             } else {  
  235.                 // 保存图片  
  236.                 File file = getOutputMediaFile();  
  237.                 this.file = file;  
  238.                 this.uri = Uri.fromFile(file);  
  239.                 if (file != null && bm != null) {  
  240.                     FileOutputStream fout;  
  241.                     try {  
  242.                         fout = new FileOutputStream(file);  
  243.                         BufferedOutputStream bos = new BufferedOutputStream(  
  244.                                 fout);  
  245.                         // Bitmap mBitmap = Bitmap.createScaledBitmap(bm,  
  246.                         // topView.getViewWidth(), topView.getViewHeight(),  
  247.                         // false);  
  248.                         bm.compress(Bitmap.CompressFormat.JPEG, 100, bos);  
  249.                         // bm.compress(Bitmap.CompressFormat.JPEG, 100, bos);  
  250.                         bos.flush();  
  251.                         bos.close();  
  252.                     } catch (FileNotFoundException e) {  
  253.                         // TODO Auto-generated catch block  
  254.                         e.printStackTrace();  
  255.                     } catch (IOException e) {  
  256.                         // TODO Auto-generated catch block  
  257.                         e.printStackTrace();  
  258.                     }  
  259.                     //返回数据  
  260.                     Intent intent = new Intent();  
  261.                     intent.setData(uri);  
  262.                     Bundle bundle = new Bundle();  
  263.                     intent.putExtras(bundle);  
  264.                     setResult(0x1001, intent);  
  265.                 }  
  266.                 finish();  
  267.             }  
  268.             break;  
  269.         case R.id.txt_cancel:  
  270.             if(CommonUtils.isFastDoubleClick())return;  
  271.             if (isPreviewing) {  
  272.                 finish();  
  273.                 // 退出相机  
  274.             } else {  
  275.                 if(myCamera == null){  
  276.                     initCamera();  
  277.                 }  
  278.                 // 重新拍照  
  279.                 try {  
  280.                     myCamera.setPreviewDisplay(mySurfaceHolder);  
  281.                     myCamera.startPreview();  
  282.                     isPreviewing = true;  
  283.                     takeTxt.setText("拍照");  
  284.                 } catch (IOException e) {  
  285.                     // TODO Auto-generated catch block  
  286.                     e.printStackTrace();  
  287.                 }  
  288.             }  
  289.             break;  
  290.         default:  
  291.             break;  
  292.         }  
  293.   
  294.     }  
  295.   
  296.     private String getCameraFocusable() {  
  297.         List<String> focusModes = myParameters.getSupportedFocusModes();  
  298.         if (focusModes  
  299.                 .contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)) {  
  300.             return Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE;  
  301.         } else if (focusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO)) {  
  302.             return Camera.Parameters.FOCUS_MODE_AUTO;  
  303.         }  
  304.         return null;  
  305.     }  
  306.   
  307.     /** A safe way to get an instance of the Camera object. */  
  308.     public Camera getCameraInstance() {  
  309.         Camera c = null;  
  310.         try {  
  311.             if (getCameraId() >= 0) {  
  312.                 c = Camera.open(getCameraId()); // attempt to get a Camera  
  313.                                                 // instance  
  314.             } else {  
  315.                 return null;  
  316.             }  
  317.         } catch (Exception e) {  
  318.             // Camera is not available (in use or does not exist)  
  319.             Log.e("getCameraInstance", e.toString());  
  320.         }  
  321.         return c; // returns null if camera is unavailable  
  322.     }  
  323.   
  324.     private int getCameraId() {  
  325.         if (!checkCameraHardware(this)) {  
  326.             return -1;  
  327.         }  
  328.         int cNum = Camera.getNumberOfCameras();  
  329.         int defaultCameraId = -1;  
  330.         CameraInfo cameraInfo = new CameraInfo();  
  331.         for (int i = 0; i < cNum; i++) {  
  332.             Camera.getCameraInfo(i, cameraInfo);  
  333.             if (cameraInfo.facing == CameraInfo.CAMERA_FACING_BACK) {  
  334.                 defaultCameraId = i;  
  335.             }  
  336.         }  
  337.         return defaultCameraId;  
  338.     }  
  339.   
  340.     /** Check if this device has a camera */  
  341.     private boolean checkCameraHardware(Context context) {  
  342.         if (context.getPackageManager().hasSystemFeature(  
  343.                 PackageManager.FEATURE_CAMERA)) {  
  344.             return true;  
  345.         } else {  
  346.             return false;  
  347.         }  
  348.     }  
  349.   
  350.     /** Create a File for saving an image or video */  
  351.     private File getOutputMediaFile() {  
  352.         File mediaStorageDir = null;  
  353.         if (android.os.Environment.getExternalStorageState().equals(  
  354.                 android.os.Environment.MEDIA_MOUNTED)) {  
  355.             mediaStorageDir = new File(  
  356.                     Environment  
  357.                             .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),  
  358.                     IMG_PATH);  
  359.             if (!mediaStorageDir.exists()) {  
  360.                 if (!mediaStorageDir.mkdirs()) {  
  361.                     return null;  
  362.                 }  
  363.             }  
  364.         } else {  
  365.             Toast.makeText(this"没有sd卡", Toast.LENGTH_SHORT).show();  
  366.             return null;  
  367.         }  
  368.         String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss")  
  369.                 .format(new Date());  
  370.         File mediaFile = new File(mediaStorageDir.getPath() + File.separator  
  371.                 + "IMG_" + timeStamp + ".jpg");  
  372.   
  373.         return mediaFile;  
  374.     }  
  375.   
  376. }</span>  
 
 


[java]  view plain  copy
  1. <span style="font-size:18px;">package com.emoney.camera;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.Context;  
  5. import android.graphics.Canvas;  
  6. import android.graphics.Color;  
  7. import android.graphics.Paint;  
  8. import android.graphics.Paint.FontMetricsInt;  
  9. import android.graphics.Paint.Style;  
  10. import android.graphics.Rect;  
  11. import android.graphics.RectF;  
  12. import android.util.AttributeSet;  
  13. import android.view.View;  
  14.   
  15. public class CameraTopRectView extends View {  
  16.   
  17.     private int panelWidth;  
  18.     private int panelHeght;  
  19.   
  20.     private int viewWidth;  
  21.     private int viewHeight;  
  22.   
  23.     private int rectWidth;  
  24.     private int rectHeght;  
  25.   
  26.     private int rectTop;  
  27.     private int rectLeft;  
  28.     private int rectRight;  
  29.     private int rectBottom;  
  30.   
  31.     private int lineLen;  
  32.     private int lineWidht;  
  33.     private static final int LINE_WIDTH = 5;  
  34.     private static final int TOP_BAR_HEIGHT = 50;  
  35.     private static final int BOTTOM_BTN_HEIGHT = 66;  
  36.     private static final int LEFT_PADDING = 10;  
  37.     private static final int RIGHT_PADDING = 10;  
  38.     private static final String TIPS = "请将身份证放入到方框中";  
  39.   
  40.     private Paint linePaint;  
  41.     private Paint wordPaint;  
  42.     private Rect rect;  
  43.     private int baseline;  
  44.   
  45.     public CameraTopRectView(Context context, AttributeSet attrs) {  
  46.         super(context, attrs);  
  47.         // TODO Auto-generated constructor stub  
  48.         Activity activity = (Activity) context;  
  49.         panelWidth = UnitUtils.getDisplayWidth(activity);  
  50.         panelHeght = UnitUtils.getDisplayHeight(activity);  
  51.   
  52.         viewHeight = panelHeght  
  53.                 - UnitUtils.getInstance(activity).dip2px(  
  54.                         TOP_BAR_HEIGHT + BOTTOM_BTN_HEIGHT);  
  55.         viewWidth = panelWidth;  
  56.   
  57.         rectWidth = panelWidth  
  58.                 - UnitUtils.getInstance(activity).dip2px(  
  59.                         LEFT_PADDING + RIGHT_PADDING);  
  60.         rectHeght = (int) (rectWidth * 54 / 85.6);  
  61.         // 相对于此view  
  62.         rectTop = (viewHeight - rectHeght) / 2;  
  63.         rectLeft = (viewWidth - rectWidth) / 2;  
  64.         rectBottom = rectTop + rectHeght;  
  65.         rectRight = rectLeft + rectWidth;  
  66.   
  67.         lineLen = panelWidth / 8;  
  68.   
  69.         linePaint = new Paint();  
  70.         linePaint.setAntiAlias(true);  
  71.         linePaint.setColor(Color.rgb(0xdd0x420x2f));  
  72.         linePaint.setStyle(Style.STROKE);  
  73.         linePaint.setStrokeWidth(LINE_WIDTH);// 设置线宽  
  74.         linePaint.setAlpha(255);  
  75.   
  76.         wordPaint = new Paint();  
  77.         wordPaint.setAntiAlias(true);  
  78.         wordPaint = new Paint(Paint.ANTI_ALIAS_FLAG);  
  79.         wordPaint.setStrokeWidth(3);  
  80.         wordPaint.setTextSize(35);  
  81.   
  82.         rect = new Rect(rectLeft, rectTop - 80, rectRight, rectTop - 10);  
  83.         FontMetricsInt fontMetrics = wordPaint.getFontMetricsInt();  
  84.         baseline = rect.top  
  85.                 + (rect.bottom - rect.top - fontMetrics.bottom + fontMetrics.top)  
  86.                 / 2 - fontMetrics.top;  
  87.         wordPaint.setTextAlign(Paint.Align.CENTER);  
  88.   
  89.     }  
  90.   
  91.     @Override  
  92.     protected void onDraw(Canvas canvas) {  
  93.         // TODO Auto-generated method stub  
  94.         super.onDraw(canvas);  
  95.         wordPaint.setColor(Color.TRANSPARENT);  
  96.         canvas.drawRect(rect, wordPaint);  
  97.         wordPaint.setColor(Color.BLACK);  
  98.         canvas.drawText(TIPS, rect.centerX(), baseline, wordPaint);  
  99.         canvas.drawLine(rectLeft, rectTop, rectLeft + lineLen, rectTop,  
  100.                 linePaint);  
  101.         canvas.drawLine(rectRight - lineLen, rectTop, rectRight, rectTop,  
  102.                 linePaint);  
  103.         canvas.drawLine(rectLeft, rectTop, rectLeft, rectTop + lineLen,  
  104.                 linePaint);  
  105.         canvas.drawLine(rectRight, rectTop, rectRight, rectTop + lineLen,  
  106.                 linePaint);  
  107.         canvas.drawLine(rectLeft, rectBottom, rectLeft + lineLen, rectBottom,  
  108.                 linePaint);  
  109.         canvas.drawLine(rectRight - lineLen, rectBottom, rectRight, rectBottom,  
  110.                 linePaint);  
  111.         canvas.drawLine(rectLeft, rectBottom - lineLen, rectLeft, rectBottom,  
  112.                 linePaint);  
  113.         canvas.drawLine(rectRight, rectBottom - lineLen, rectRight, rectBottom,  
  114.                 linePaint);  
  115.     }  
  116.   
  117.     public int getRectLeft() {  
  118.         return rectLeft;  
  119.     }  
  120.   
  121.     public int getRectTop() {  
  122.         return rectTop;  
  123.     }  
  124.   
  125.     public int getRectRight() {  
  126.         return rectRight;  
  127.     }  
  128.   
  129.     public int getRectBottom() {  
  130.         return rectBottom;  
  131.     }  
  132.   
  133.     public int getViewWidth() {  
  134.         return viewWidth;  
  135.     }  
  136.   
  137.     public int getViewHeight() {  
  138.         return viewHeight;  
  139.     }  
  140.   
  141. }  
  142. </span>  
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值