一. 简介

本节学习目标是使用手机摄像头,并将拍摄到的影像呈现在surfaceView上。


二.相关方法介绍

按照惯例,首先来总结学习下将会用到的类和方法以及相关的基础知识。


1.申请权限

为了使用camera,首先我们需要申请权限,安卓摄像头的权限为android.permission.CAMERA。


2.Camera 类的相关方法

Camera.open(); 打开设备摄像头,并返回一个Camera对象。可以通过返回的对象管理摄像头。

Camera.setPreviewDisplay(SurfaceHolder holder); 设置显示摄像头内容的surfaceView,参数为显示surfaceVIew所对应的surfaceHolder。

Camera.startPreview();  开始预览摄像头。即在surfaceView上显示摄像头拍摄信息。

Camera.stopPreview();  关闭摄像头。

Camera.release(); 放开摄像头。


3.surfaceView类的想关方法。

SurfaceView.getHolder(); 获得surfaceHolder对象,surfaceHolder能够对surfaceView进行控制,且能够添加回调函数来监控surfaceView的变化,同时我们也需要获得surfaceHolder来作为Camera.setPreviewDisplay();方法的参数。


public abstract void addCallback (SurfaceHolder.Callback callback) ; 为surfaceHolder添加回调方法,我们可以直接在使用方法的时候new 一个callback或者实现callback的接口SurfaceHolder.Callback;

public abstract void setType (int type); 在早期的安卓中,我们需要这个方法来设置surfaceView的类型,一般值设置为SURFACE_TYPE_PUSH_BUFFERS; 但是在API 11中该方法已经过时,系统会默认为其设置值。这点还需要再实际开发中再进行验证。

surfaceHolder的三个回调函数。

public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) ;
public void surfaceCreated(SurfaceHolder arg0) ;
public void surfaceDestroyed(SurfaceHolder arg0);

 

三. 使用步骤


1.添加权限


首先我们需要在工程,androidMainfest文件中添加权限。


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




近来发现如果将permission添加在application后面可能会有问题,所以以后加permission还是加到application前面吧。



2. 修改XML文件


现在来修改布局。


添加一个surfaceView控件用来显示摄像头内容,两个按钮用来控制摄像头开关。



3.初始化


初始化surfaceView, button, 以及surfaceHolder;


surfaceView = (SurfaceView) findViewById(R.id.sv);
	startButton = (Button) findViewById(R.id.button1);
	stopButton = (Button) findViewById(R.id.button2);
	surfaceHolder = surfaceView.getHolder();
	surfaceHolder.addCallback(this);
	surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        startButton.setOnClickListener(this);
	stopButton.setOnClickListener(this);



4.初始化camera类


myCamera = Camera.open();    //获得摄像头对象
	try {
		myCamera.setPreviewDisplay(surfaceHolder);           //将surfaceHolder与camera对象绑定,使camera影像呈现在该surfaceview上。

	} catch (IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}




5.添加按键响应函数



@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.button1:
			if(!isPreview){
				myCamera.startPreview();		//开启预览
				isPreview = true;					
			}
			break;
		case R.id.button2:
			if(isPreview){
				myCamera.stopPreview();
				isPreview = false;
			}
			
			break;

		default:
			break;
		}
		
	}

四. 注意点



在开发中发现,默认情况下camera在surfaceview中的方向与正常方向差了90度,所以需要使用Camera.setDisplayOrientation(90);来调整。surfaceHolder.setType();使用与不使用结果相同。



五. 总结


到这里我们已经完成了摄像头使用的开发,现在就可以将应用安装到手机上来看看效果了。