Android Camera——拍照

               

http://vaero.blog.51cto.com/4350852/779942

Camera定义在package android.hardware内,具体用法SDK里叙述的可清楚了。架构解析什么的网上也有很多,没什么必要讲了(你认为我不知道我会说吗)。

         这篇呢,就整理了下Camera的拍照,其他还木有==
 
一、系统相机
         1)调用方式
         系统相机的入口Action:MediaStore.ACTION_IMAGE_CAPTURE。只需以startActivityForResult(…)启动该Activity即可。
  
  
  1. // 调用系统相机 
  2. Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
  3. startActivityForResult(intent, 1); 
         2)处理方式
         在onActivityResult(…)中,处理返回信息。
  
  
  1. protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
  2.     if (1 == requestCode) { // 系统相机返回处理 
  3.         if (resultCode == Activity.RESULT_OK) { 
  4.             Bitmap cameraBitmap = (Bitmap) data.getExtras().get("data"); 
  5.             …… // 处理图像 
  6.         } 
  7.         takeBtn1.setClickable(true); 
  8.     }  
  9.     super.onActivityResult(requestCode, resultCode, data); 
 
二、自定义相机
         1)照相预览
         继承SufaceView写自己的预览 界面,继而放到你的照相Activity的布局里。这里面有个相机拍照监听接口,用于在Activity里再处理这些操作。
  
  
  1. public class CameraPreview extends SurfaceView implements 
  2.         SurfaceHolder.Callback { 
  3.  
  4.     /** LOG标识 */ 
  5.     // private static final String TAG = "CameraPreview"; 
  6.  
  7.     /** 分辨率 */ 
  8.     public static final int WIDTH = 1024
  9.     public static final int HEIGHT = 768
  10.  
  11.     /** 监听接口 */ 
  12.     private OnCameraStatusListener listener; 
  13.  
  14.     private SurfaceHolder holder; 
  15.     private Camera camera; 
  16.  
  17.     // 创建一个PictureCallback对象,并实现其中的onPictureTaken方法 
  18.     private PictureCallback pictureCallback = new PictureCallback() { 
  19.  
  20.         // 该方法用于处理拍摄后的照片数据 
  21.         @Override 
  22.         public void onPictureTaken(byte[] data, Camera camera) { 
  23.  
  24.             // 停止照片拍摄 
  25.             camera.stopPreview(); 
  26.             camera = null
  27.  
  28.             // 调用结束事件 
  29.             if (null != listener) { 
  30.                 listener.onCameraStopped(data); 
  31.             } 
  32.         } 
  33.     }; 
  34.  
  35.     // Preview类的构造方法 
  36.     public CameraPreview(Context context, AttributeSet attrs) { 
  37.         super(context, attrs); 
  38.         // 获得SurfaceHolder对象 
  39.         holder = getHolder(); 
  40.         // 指定用于捕捉拍照事件的SurfaceHolder.Callback对象 
  41.         holder.addCallback(this); 
  42.         // 设置SurfaceHolder对象的类型 
  43.         holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
  44.     } 
  45.  
  46.     // 在surface创建时激发 
  47.     public void surfaceCreated(SurfaceHolder holder) { 
  48.         // Log.e(TAG, "==surfaceCreated=="); 
  49.         // 获得Camera对象 
  50.         camera = Camera.open(); 
  51.         try { 
  52.             // 设置用于显示拍照摄像的SurfaceHolder对象 
  53.             camera.setPreviewDisplay(holder); 
  54.         } catch (IOException e) { 
  55.             e.printStackTrace(); 
  56.             // 释放手机摄像头 
  57.             camera.release(); 
  58.             camera = null
  59.         } 
  60.     } 
  61.  
  62.     // 在surface销毁时激发 
  63.     public void surfaceDestroyed(SurfaceHolder holder) { 
  64.         // Log.e(TAG, "==surfaceDestroyed=="); 
  65.         // 释放手机摄像头 
  66.         camera.release(); 
  67.     } 
  68.  
  69.     // 在surface的大小发生改变时激发 
  70.     public void surfaceChanged(final SurfaceHolder holder, int format, int w, 
  71.             int h) { 
  72.         // Log.e(TAG, "==surfaceChanged=="); 
  73.         try { 
  74.             // 获取照相机参数 
  75.             Camera.Parameters parameters = camera.getParameters(); 
  76.             // 设置照片格式 
  77.             parameters.setPictureFormat(PixelFormat.JPEG); 
  78.             // 设置预浏尺寸 
  79.             parameters.setPreviewSize(WIDTH, HEIGHT); 
  80.             // 设置照片分辨率 
  81.             parameters.setPictureSize(WIDTH, HEIGHT); 
  82.             // 设置照相机参数 
  83.             camera.setParameters(parameters); 
  84.             // 开始拍照 
  85.             camera.startPreview(); 
  86.         } catch (Exception e) { 
  87.             e.printStackTrace(); 
  88.         } 
  89.     } 
  90.  
  91.     // 停止拍照,并将拍摄的照片传入PictureCallback接口的onPictureTaken方法 
  92.     public void takePicture() { 
  93.         // Log.e(TAG, "==takePicture=="); 
  94.         if (camera != null) { 
  95.             // 自动对焦 
  96.             camera.autoFocus(new AutoFocusCallback() { 
  97.                 @Override 
  98.                 public void onAutoFocus(boolean success, Camera camera) { 
  99.                     if (null != listener) { 
  100.                         listener.onAutoFocus(success); 
  101.                     } 
  102.                     // 自动对焦成功后才拍摄 
  103.                     if (success) { 
  104.                         camera.takePicture(nullnull, pictureCallback); 
  105.                     } 
  106.                 } 
  107.             }); 
  108.         } 
  109.     } 
  110.  
  111.     // 设置监听事件 
  112.     public void setOnCameraStatusListener(OnCameraStatusListener listener) { 
  113.         this.listener = listener; 
  114.     } 
  115.  
  116.     /** 
  117.      * 相机拍照监听接口 
  118.      */ 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值