Camera 使用记录

来源:互联网 发布:服装尺码对照表软件 编辑:程序博客网 时间:2024/06/08 11:50

android camera介绍

android手机关于Camera的使用,一是拍照,二是摄像,由于Android提供了强大的组件功能,为此对于在Android手机系统上进行Camera的开发,我们可以使用两类方法:一是借助Intent和MediaStroe调用系统Camera App程序来实现拍照和摄像功能,二是根据Camera API自写Camera程序。由于自写Camera需要对Camera API了解很充分,而且对于通用的拍照和摄像应用只需要借助系统Camera App程序就能满足要求了。

在AndroidMainfest.xml中声明使用照相机.

  <uses-permission android:name="android.permission.CAMERA" />    <uses-feature android:name="android.hardware.camera" />    <uses-feature android:name="android.hardware.camera.autofocus" />    <uses-permission android:name="android.permission.RECORD_AUDIO" />    <uses-permission android:name="android.permission.RECORD_VIDEO" />    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

调用系统相机进行拍照或拍摄

构造一个Camera Intent -- 创建一个拍摄照片或者视频的Intent, 我们可以使用如下两种方法:
MediaStore.ACTION_IMAGE_CAPTURE -- 一个intent action,用来向系统Camera程序请求拍摄图片。
MediaStore.ACTION_VIDEO_CAPTURE -- 一个intent action, 用来向系统Camera程序请求录制视频。
MediaStore.EXTRA_OUTPUT -- 指定一个Uri对象,系统Camera程序会把拍摄的图片存储到指定位置。
MediaStore.EXTRA_VIDEO_QUALITY -- 视频质量,0(低质量,比较小的文件来存储视频), 1(高质量,比较大的文件来存储视频)
MediaStore.EXTRA_DURATION_LIMIT -- 设置一个值来限制视频时间长度,秒为单位。
MediaStore.EXTRA_SIZE_LIMIT -- 设置一个值来限制视频大小,byte为单位。

拍照示例代码:
<pre name="code" class="java">// create Intent to take a picture and return control to the calling applicationIntent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);    Uri fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); // create a file to save the image    intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // set the image file name    // start the image capture Intent    startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);

录像示例代码:
Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);startActivityForResult(intent, 1);

自定义预览流程

private void initSurfaceView() {this.mSurfaceview = ((SurfaceView) findViewById(R.id.surface_camera));this.mSurfaceHolder = this.mSurfaceview.getHolder();this.mSurfaceHolder.setFormat(-3);this.mSurfaceHolder.setType(3);this.mSurfaceHolder.addCallback(this);}


@Overridepublic void surfaceCreated(SurfaceHolder holder) {this.mCamera = Camera.open();try {this.mCamera.setPreviewDisplay(this.mSurfaceHolder);this.mCamera.setPreviewCallback(this.mPreviewCallback);} catch (Exception localException) {while (true) {if (this.mCamera != null) {this.mCamera.release();this.mCamera = null;}}}}private void initCamera() {Camera.Parameters localParameters = this.mCamera.getParameters();localParameters.setPictureFormat(256);localParameters.setPreviewFormat(17);     localParameters.setPreviewSize(mPreviewWidth,mPreviewHeight);localParameters.setPictureSize(mPreviewWidth, mPreviewHeight);localParameters.setPreviewFrameRate(15);this.mCamera.setParameters(localParameters);this.mCamera.startPreview();}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {if (this.mCamera != null) {this.mCamera.setPreviewCallback(null);this.mCamera.stopPreview();this.bIfPreview = false;this.mCamera.release();this.mCamera = null;}}
  // 提供一个静态方法,用于根据手机方向获得相机预览画面旋转的角度      public static int getPreviewDegree(Activity activity) {          // 获得手机的方向          int rotation = activity.getWindowManager().getDefaultDisplay()                  .getRotation();          int degree = 0;          // 根据手机的方向计算相机预览画面应该选择的角度          switch (rotation) {          case Surface.ROTATION_0:              degree = 90;              break;          case Surface.ROTATION_90:              degree = 0;              break;          case Surface.ROTATION_180:              degree = 270;              break;          case Surface.ROTATION_270:              degree = 180;              break;          }          return degree;      }  

获取预览画面数据

mCamera.setPreviewCallback(this.mPreviewCallback);
private Camera.PreviewCallback mPreviewCallback = new Camera.PreviewCallback() {public void onPreviewFrame(byte[] paramAnonymousArrayOfByte,Camera paramAnonymousCamera) {if (mEncoding) {mInstance0.rtmpInput(paramAnonymousArrayOfByte);}}};

拍照及处理事件

  camera.takePicture(null, null, new MyPictureCallback()); 
private final class MyPictureCallback implements PictureCallback {            @Override          public void onPictureTaken(byte[] data, Camera camera) {              try {  
<span style="white-space:pre"></span>//处理data数据                camera.startPreview(); // 拍完照后,重新开始预览                } catch (Exception e) {                  e.printStackTrace();              }          }      }  












0 0