Camera 使用记录

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 application
		Intent 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);
		
	}


	@Override
	public 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();
		
	}

	@Override
	public 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值