原创 Android笔记12- 摄像抓拍

2014-7-29 20:25 3265 26 26 分类: 软件与OS 文集: Android
一、基本了解
我们来看谷歌官方文档—— 
 
1、基本类
Android 框架通过 Camera API  或者 camer Intent 的方式,支持 捕捉图像和视频 。相关的大类主要有以下几个:
(1) Camera  摄像时候必须调用到的类;
 
(2)SurfaceView  提供摄像头预览。
 
(3)MediaRecorder 录像时候用到的类;
 
(4)Intent 如果不通过 Camera 对象来操控摄像头,那么用两个intent 动作 MediaStore.ACTION_IMAGE_CAPTURE or MediaStore.ACTION_VIDEO_CAPTURE  也能够实现摄影和录像。
 

o    MediaStore.ACTION_IMAGE_CAPTURE —— 向内置摄像头程序请求图像的意图活动类型。

o    MediaStore.ACTION_VIDEO_CAPTURE —— 向内置摄像头程序请求视频的意图活动类型。

 
2、 Manifest 声明
在使用Camera API前,必须做出使用 Camera 硬件的声明。主要有下面 点:
(1) Camera 允许:(注意,如果是通过intent 意图来操控的,则不需要下面声明)
 android:name="android.permission.CAMERA" /><>
(2)Camera 特征,比如说名字
 android:name="android.hardware.camera" /><>
(3)如果你要在SD卡中保存照片和视频,那么就得开启SD卡权限
 android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><>
(4)录音权限
 android:name="android.permission.RECORD_AUDIO" /><>
(5)如果希望在照片中插入GPS当地信息,还得开启GPS 
 android:name="android.permission.ACCESS_FINE_LOCATION" /><>
 
3、使用方法
使用摄像头的方法有两种:
一种是编写代码比较少的,快速使用摄像头的意图Intent 方法;
另外一种就是 自动外观的摄像头用户界面,要求编写更多的代码。
 
二、具体使用
1、使用Intent 快速应用摄像头:使用默认配置拍摄并保存
 
 /*
  * 前置摄像头抓拍
  * */
 /*--------------------------摄像头程序-begin--------------------------------*/
   
 camera_catch.setOnClickListener(new OnClickListener()
 {
  @Override
  public void onClick(View source)
  {
   Intent capture_intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
   //创建一个文件来保存图片
   File out = new File(capture_path);
   //转换为URI地址
   Uri uri = Uri.fromFile(out);
   //设置图片保存
   capture_intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
   //图片质量为高
   capture_intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY,1);
   //启动拍照意图
   startActivityForResult(capture_intent, CAPTURE_REQUEST_CODE);
 
  }
 });
 
 }
 
 /*
  * 拍照,并保存数据,通过重写onActivityResult 方法去返回处理结果给主main:RFID
  * */
 @Override
 protected void onActivityResult(int requestCode,int resultCode,Intent data)
 {
  //重写父类方法
  super.onActivityResult(requestCode, resultCode, data);
 
  if(requestCode == CAPTURE_REQUEST_CODE) //判断是摄像头请求
  {
   if(resultCode == RESULT_OK)
   {
    //拍照图像显示
    Bitmap capture_bm = (Bitmap) data.getExtras().get("data");
    p1_image.setImageBitmap(capture_bm);
    File captureFile = new File(capture_path);
   
    try {
     
     BufferedOutputStream bos = new BufferedOutputStream(
       new FileOutputStream(captureFile));
     capture_bm.compress(Bitmap.CompressFormat.JPEG, 100, bos);
     bos.flush();
     bos.close();
    } catch (Exception e) {
     // TODO: handle exception
     Toast.makeText(this, "没有找到照片文件", 1000).show();
    }
   }
  }
 }
 /*--------------------------摄像头程序-end--------------------------------*/
 
 
 
 
 
2、自定义摄像头:预览、聚焦后才拍摄
主要步骤如下:
 
 
(1)调用 Camera 的 open() 方法打开相机,该方法默认打开后置摄像头,如果打开前置摄像头,就必须获得前置摄像头的ID,然后传入该ID ; (一般后置ID 是0 ,前置是1 ,Android 2.3 (API Level 9) 以上版本允许利用Camera.getNumberOfCameras()方法来检查设备可用摄像头的数量
 

可用Camera.open()方法来访问主摄像头,并确保捕获全部的异常,示例代码如下:

/** 安全获取Camera对象实例的方法*/

public static Camera getCameraInstance(){

    Camera c = null;

    try {

        c = Camera.open(int ID); // 试图获取Camera实例,ID 指的是摄像头ID

    }

    catch (Exception e){

        // 摄像头不可用(正被占用或不存在)

    }

    return c; // 不可用则返回null

}

注意,每次使用 Camera open() 时都要检查异常,如果摄像头被占用或者不存在的话,未检查异常将会导致应用程序被系统强行关闭。
 
(2)调用 Camera 的getParameters() 方法获取拍照 参数,该方法返回一个Camera.Parameters 对象;
调用Camera.Parameters 对象方法设置拍照参数;可用Camera.getCameraInfo()来确定摄像头朝前还是朝后以及图像的方向。
 
(3)调用Camera的 takePciture()方法 进行拍照。
 
(4)结束程序时,调用release() 来释放资源。
 
 camera = Camera.open(1); //打开前置摄像头
   
   //设置图片格式
   if(camera != null)
   {
    try {
     
     //设置摄像头参数
     Camera.Parameters parameters = camera.getParameters();
     //设置图片格式
     parameters.setPictureFormat(ImageFormat.JPEG);
     //设置图片质量
     parameters.set("jpeg-quality", 100);
     
     
    } catch (Exception e) {
     e.printStackTrace();// TODO: handle exception
    }
   }
 
 
 

文章评论0条评论)

登录后参与讨论
我要评论
0
26
关闭 站长推荐上一条 /2 下一条