android 摄像头

一、引入:

        在Android手机上进行Camera开发,可以使用两类方法:

1、借助Intent和MediaStore调用系统Camera APP程序来实现拍照或摄像。一般通用的拍照和摄像均采用此方法;

2、根据Camera API实现自定义Camera程序。这需要对Camera API有充分了解。

二、使用Intent拍摄照片:【重要

1、Intent启动系统摄像头:

Intent intent = new Intent();

intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);

startActivityForResult(intent, 1);

2、通过onActivityResult()处理程序: 也就是在onActivityResult()获取Bitmap对象。

onActivityResult(int requestCode, int resultCode, Intent data) {

 if (requestCode == 1 && resultCode == Activity.RESULT_OK) {

  bm_camera = (Bitmap) data.getExtras().get("data");

  imageView_editpic.setImageBitmap(bm_camera);

 }

}

3、保存Bitmap至SD卡中:

SimpleDateFormat sDateFormat = new SimpleDateFormat("yyyyMMddhhmmss");

String date = sDateFormat.format(new Date());

//生成照片名称

String fileName = "img_" + date + ".jpg";

//创建输出流对象

BufferedOutputStream bos = new BufferedOutputStream( new FileOutputStream(new File(filePath + File.separator 

    + fileName)));

//将图片保存进输出流

boolean flag = bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos);

bos.flush();

bos.close();

4、权限:

三、自定义拍照实现步骤: 【掌握

(一)、initSurfaceView()

1、surfaceView_main初始化: findViewById() 

2、初始化surfaceHolder对象: surfaceView_main.getHolder();

3、设置类型,没有这句将调用失败

surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

4、添加回调

surfaceHolder.addCallback(new SurfaceHolder.Callback()) ;

1)、surfaceCreated()

开启手机摄像头

myCamera = Camera.open();

设置显示拍照预览的SurfaceHolder对象:

myCamera.setPreviewDisplay(holder);

设置拍照预览的显示方向:由于摄像头预览的方向与实际方向相差90度角,所以要将显示方向旋转90度。

myCamera.setDisplayOrientation(90);

2)、surfaceChanged()

设置相机参数:

Camera.Parameters params = myCamera.getParameters();

params.setPictureFormat(PixelFormat.JPEG);

myCamera.setParameters(params);

摄像头开始预览

myCamera.startPreview();

相机对焦:

myCamera.autoFocus(new AutoFocusCallback(){

 提示聚焦成功

});

3)、surfaceDestroyed()

停止摄像头预览

myCamera.stopPreview();

释放手机摄像头

myCamera.release();

myCamera = null;

(二)、相机拍照:

myCamera.takePicture(null, null, pictureCallback);

pictureCallback = new PictureCallback() {

 onPictureTaken(byte[] data, Camera camera) {

    // 获得拍摄的照片——Bitmap对象

     Bitmap bm = BitmapFactory.decodeByteArray(data, 0,  data.length); 

     // 停止照片拍摄

     myCamera.stopPreview();

     // 创建操作图片用的matrix对象。因为照片方向与实际方向相差90度,所以此步的目的是实现图片旋转

     Matrix matrix = new Matrix();

     matrix.postRotate(90);

     // 创建新的Bitmap对象 ,显示在预览区域

     bm_camera = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(),  bm.getHeight(), matrix, true); 

     imageView_editpic.setImageBitmap(bm_camera);

 }

}

(三)、保存图片进SD卡:

(四)、设置权限:

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

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

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

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

(五)、使用ZoomControls浏览图片:【可选项】

import android.widget.ZoomControls;

// 定义图片缩放的步长值

private float scaleWidth = 1,scaleHeight = 1;

zoomControls = (ZoomControls) findViewById();

// 放大监听

zoomControls.setOnZoomInClickListener(new OnClickListener() {

 @Override

 public void onClick(View v) {

  // 设置图片缩放比例。单击放大,将以1.25倍的速率放大。

  double scale = 1.25;

  scaleWidth = (float) (scaleWidth * scale);

  scaleHeight = (float) (scaleHeight * scale);

// 为了防止图片过大而超过内存,设置了一个极限值

  if (scaleWidth > 1.25) {

   scaleWidth = 1;

   scaleHeight = 1;

  }

  // 产生新的Bitmap对象

  Matrix matrix = new Matrix();

  //重新整合矩阵对象

  matrix.postScale(scaleWidth, scaleHeight);

  Bitmap resizeBmp = Bitmap.createBitmap(bitmap_pic, 0, 0,  bitmap_pic.getWidth(), bitmap_pic.getHeight(), matrix, 

    true);

  imageView_picture.setImageBitmap(resizeBmp);

 }

});

// 缩小监听

zoomControls.setOnZoomOutClickListener(new OnClickListener() {

 @Override

 public void onClick(View v) {

  // 设置图片缩放比例。单击缩小,图片将以0.8倍的速率缩小。

  double scale = 0.8;

  scaleWidth = (float) (scaleWidth * scale);

  scaleHeight = (float) (scaleHeight * scale);

  // 产生新的Bitmap对象

  Matrix matrix = new Matrix();

  //重新整合矩阵对象

  matrix.postScale(scaleWidth, scaleHeight);

  Bitmap resizeBmp = Bitmap.createBitmap(bitmap_pic, 0, 0, bitmap_pic.getWidth(), bitmap_pic.getHeight(), matrix, 

    true);

  imageView_picture.setImageBitmap(resizeBmp);

 }

});

猜你喜欢

转载自blog.csdn.net/dubo_csdn/article/details/86105001