我们要调用摄像头的拍照功能,显然
第一步必须加入调用摄像头硬件的权限,拍完照后我们要将图片保存在SD卡中,必须加入SD卡读写权限,所以第一步,我们应该在Android清单文件中加入以下代码
我们是用SurfaceView这个视图组件来实现的,因此在main.xml中加入下列代码
第三步,设置窗口的显示方式
至此,我们将窗口的显示方式规定死了,然后才能设置窗口上显示的组件(顺序非常重要)
第四步,设置SurficeView显示控件的属性
第五步,就是为surficeView加入回调方法(callBack)
surfaceView.getHolder().addCallback(new SurfaceCallback());
上面的回调类是我们自己定义的,代码如下
private class SurfaceCallback
implements SurfaceHolder.Callback{
@Override
public void
surfaceCreated(SurfaceHolder holder) {
try {
camera =
Camera.open();//打开硬件摄像头,这里导包得时候一定要注意是android.hardware.Camera
WindowManager wm = (WindowManager)
getSystemService(Context.WINDOW_SERVICE);//得到窗口管理器
Display display
=
wm.getDefaultDisplay();//得到当前屏幕
Camera.Parameters parameters =
camera.getParameters();//得到摄像头的参数
parameters.setPreviewSize(display.getWidth(),
display.getHeight());//设置预览照片的大小
parameters.setPreviewFrameRate(3);//设置每秒3帧
parameters.setPictureFormat(PixelFormat.JPEG);//设置照片的格式
parameters.setJpegQuality(85);//设置照片的质量
parameters.setPictureSize(display.getHeight(),
display.getWidth());//设置照片的大小,默认是和
屏幕一样大
camera.setParameters(parameters);
camera.setPreviewDisplay(surfaceView.getHolder());//通过SurfaceView显示取景画面
camera.startPreview();//开始预览
isPreview =
true;//设置是否预览参数为真,在类最上层定义public boolean isPreview =
false;然后在此处赋值。
} catch (IOException e) {
Log.e(TAG, e.toString());
}
}
@Override
public void
surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method
stub
}
@Override
public void
surfaceDestroyed(SurfaceHolder holder) {
if(camera!=null){
}
第六步,我们必须对按键事件进行监听,如是拍照还是聚焦,代码如下
public boolean onKeyDown(int
keyCode, KeyEvent event) {//处理按键事件
if(camera!=null&&event.getRepeatCount()==0)//代表只按了一下
{
switch(keyCode){
case
KeyEvent.KEYCODE_BACK://如果是搜索键
}
}
return
true;//阻止事件往下传递,否则按搜索键会变成系统默认的
}
------------------------------------------------------------------------------------------
private final class
TakePictureCallback implements PictureCallback{
public void onPictureTaken(byte[]
data, Camera camera) {
try {
Bitmap bitmap =
BitmapFactory.decodeByteArray(data, 0, data.length);
File file = new
File(Environment.getExternalStorageDirect ory(),System.currentTimeMillis()+".jpg");
FileOutputStream outputStream = new
FileOutputStream(file);
bitmap.compress(CompressFormat.JPEG,
100, outputStream);
outputStream.close();
camera.stopPreview();
camera.startPreview();//处理完数据之后可以预览
} catch (Exception e) {
Log.e(TAG, e.toString());
}
}
}
注意,代码中有两个回调类,一个是SurfaceCallback(),另外一个是TakePictureCallback(),初学者可能一时难以理
解,通俗地讲,前者是用来监视surficeView这个暂时存放图片数据的显示控件的,根据它的显示情况调用不同的方法,包括
surfaceCreated(),surfaceChanged(),surfaceDestroyed(),也就不难理解为什么会有这三个回调方法了
(注意,在surfaceDestroyed()方法中必须释放摄像头,详细代码参见上方)。TakePictureCallback()是为了监视是否
拍照而设计的接口,期中也仅有一个方法,camera将拍照得到的数据传入方法,我们便可以对拍照得到的数据进行进一步处理了。
至此,简单的拍照功能介绍完毕!