一. 简介
本节学习目标是使用手机摄像头,并将拍摄到的影像呈现在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();使用与不使用结果相同。
五. 总结
到这里我们已经完成了摄像头使用的开发,现在就可以将应用安装到手机上来看看效果了。