本节学习目标是使用手机摄像头,并将拍摄到的影像呈现在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);
<uses-permission android:name="android.permission.CAMERA"/>
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);
myCamera = Camera.open(); //获得摄像头对象 try { myCamera.setPreviewDisplay(surfaceHolder); //将surfaceHolder与camera对象绑定,使camera影像呈现在该surfaceview上。 } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }
@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;
}
}