Android调用Camera摄像机拍照

我们可以使用两类方法:

一是借助IntentMediaStroe调用系统Camera App程序来实现拍照和摄像功能

二是根据Camera API自写Camera程序(如360的拍照软件)

 

这里主要记录第二点

1.【添加权限】

必须在manifest内声明使用权限,通常由以下三项

<uses-permission android:name = "android.permission.CAMERA" />

<uses-feature android:name = "android.hardware.camera" />

<uses-feature android:name = "android.hardware.camera.autofocus" />

一般拍照和摄像的时候需要写到sd卡上,所以还有一向权限声明如下

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

 

2.【初始化】

ActivityOnCreate函数中设置好SurfaceView,包括设置SurfaceHolder.Callback对象和SurfaceHolder对象的类型,具体如下

  sv = (SurfaceView)findViewById(R.id.peoplemanage_sv_001);
  sh = sv.getHolder();
  sh.addCallback(this);//(这里注意,要求Activity实现接口   implements Callback   ,下面3,4,5步的三个函数都是实现这个接口的)
  sh.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); // 设置该SurfaceHolder自己不维护缓冲
  

3.【打开摄像头】

@Override
 public void surfaceCreated(SurfaceHolder holder) {
  // TODO Auto-generated method stub
  if (!isOpen) {// 如果相机未打开
   try {
    int num = Camera.getNumberOfCameras();//获取摄像头的数量
    for (int i = 0; i < num; i++) {
     Camera.CameraInfo info  = new Camera.CameraInfo();
     Camera.getCameraInfo(i,info);
     if (info.facing == CameraInfo.CAMERA_FACING_BACK) {//后置摄像头
      camera = Camera.open(i); // 打开相机
      isOpen = true;
      break;
     }
    }
   } catch (Exception e) {
    // TODO: handle exception
    isOpen = false;
   }
  }
 }

 

4.【预览】

@Override
 public void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {
  // TODO Auto-generated method stub
  if (isOpen) {
   try {
    camera.setPreviewDisplay(sh); // 设置用于显示预览的SurfaceView
    Camera.Parameters parameters = camera.getParameters(); // 获取相机参数
    parameters.setPictureFormat(PixelFormat.JPEG); // 指定图片为JPEG图片
    parameters.set("jpeg-quality", 80); // 设置图片的质量
    parameters.set("orientation", "landscape"); // 设置竖屏
    parameters.setPictureSize(640, 480); // 设置拍摄图片的尺寸
    camera.setParameters(parameters); // 重新设置相机参数
    camera.setDisplayOrientation(90);
    camera.autoFocus(null); // 设置自动对焦
    camera.startPreview(); // 开始预览
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
 }

 

5.【释放摄像头】

@Override
 public void surfaceDestroyed(SurfaceHolder holder) {
  // TODO Auto-generated method stub
  // 释放手机摄像头
  camera.release();
 }

 

6.【其它细节】

 private SurfaceView sv = null;
 private SurfaceHolder sh = null;
 private Camera camera; // 相机对象
 private boolean isOpen = false; // 是否为预览模式
 

        <SurfaceView
            android:id="@+id/peoplemanage_sv_001"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

 

 

参考http://www.cnblogs.com/franksunny/archive/2011/11/17/2252926.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值