展会信息港展会大全

Android ApiDemos示例解析(57):Graphics->CameraPreview
来源:互联网   发布日期:2015-09-29 10:17:01   浏览:2461次  

导读:本例介绍了如何使用设备的摄像头来预览将要拍摄的照片,本例需要真实的手机来运行:謀偏中用到两个方面的知识:SurfaceView 和android.hardware.Camera。Sur...

本例介绍了如何使用设备的摄像头来预览将要拍摄的照片,本例需要真实的手机来运行:

例子中用到两个方面的知识:SurfaceView 和android.hardware.Camera。

SurfaceView 为View的子类,它提供一个专门用于绘图的Surface,目的是允许使用工作线程中这个Surface上绘图,这样对于应费时的绘图操作无需放在UI线程中,而是可以在单独的工作线程中按照自己的节奏来绘图。

使用SurfaceView时需要从SurfaceView派生一个子类,这个子类需要实现SurfaceHolder.Callback接口,这个接口提供了几个回调函数用于通知应用关于Surface的消息,如什么时候创建,改变大小,销毁等。实现这些回调函数非常重要,应用可以在这些回调函数来调整Surface的一些说明,知道何时可以在Surface绘制等。通常在这个SurfaceView的派生类中会定义一个工作线程用于绘图。

在Surface上绘图时,不是通过直接的函数调用,而是通过获取Surface句柄(SurfaceHolder)的间接方法.因此在Surface初始化时,调用getHolder()来获取Surface的句柄。通常是在获取SurfaceHolder之后,再调用mHolder.addCallback(this)来响应SurfaceHolder.Callback事件。

如何使用工作线程中Surface 的Canvas上绘制图形本例没有涉及,将在后面的例子说明。

下面代码定义了SurfaceView子类并实现SurfaceHolder.Callback接口。

[java]

class Preview extends SurfaceView implements SurfaceHolder.Callback {

SurfaceHolder mHolder;

Camera mCamera;

...

public void surfaceCreated(SurfaceHolder holder) {

// The Surface has been created, acquire the

// camera and tell it where

// to draw.

mCamera = Camera.open();

try {

mCamera.setPreviewDisplay(holder);

} catch (IOException exception) {

mCamera.release();

mCamera = null;

// TODO: add more exception handling logic here

}

}

public void surfaceDestroyed(SurfaceHolder holder) {

// Surface will be destroyed when we return,

//so stop the preview.

// Because the CameraDevice object is not a

//shared resource, it's very

// important to release it when the activity is paused.

mCamera.stopPreview();

mCamera.release();

mCamera = null;

}

public void surfaceChanged(SurfaceHolder holder,

int format, int w, int h) {

// Now that the size is known, set up the

//camera parameters and begin

// the preview.

Camera.Parameters parameters = mCamera.getParameters();

List<Size> sizes = parameters.getSupportedPreviewSizes();

Size optimalSize = getOptimalPreviewSize(sizes, w, h);

parameters.setPreviewSize(optimalSize.width, optimalSize.height);

mCamera.setParameters(parameters);

mCamera.startPreview();

}

class Preview extends SurfaceView implements SurfaceHolder.Callback {

SurfaceHolder mHolder;

Camera mCamera;

...

public void surfaceCreated(SurfaceHolder holder) {

// The Surface has been created, acquire the

// camera and tell it where

// to draw.

mCamera = Camera.open();

try {

mCamera.setPreviewDisplay(holder);

} catch (IOException exception) {

mCamera.release();

mCamera = null;

// TODO: add more exception handling logic here

}

}

public void surfaceDestroyed(SurfaceHolder holder) {

// Surface will be destroyed when we return,

//so stop the preview.

// Because the CameraDevice object is not a

//shared resource, it's very

// important to release it when the activity is paused.

mCamera.stopPreview();

mCamera.release();

mCamera = null;

}

public void surfaceChanged(SurfaceHolder holder,

int format, int w, int h) {

// Now that the size is known, set up the

//camera parameters and begin

// the preview.

Camera.Parameters parameters = mCamera.getParameters();

List<Size> sizes = parameters.getSupportedPreviewSizes();

Size optimalSize = getOptimalPreviewSize(sizes, w, h);

parameters.setPreviewSize(optimalSize.width, optimalSize.height);

mCamera.setParameters(parameters);

mCamera.startPreview();

}

Camera 这里使用的Camera类是定义在android.hardware包中代表的是摄像头硬件设备,Camera类可以用来设置设备摄像头的配置,开始/停止预览,拍照或是视频。这个类是Camera服务(用来管理实际设备的服务)的客户端。

为了能使用设备的摄像头,必须在AndroidManifest.xml中定义对应的权限permission和uses-feature如下:

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

<uses-feature android:name=”android.hardware.camera” />

<uses-feature android:name=”android.hardware.camera.autofocus” android:required=”false” />

使用Camera拍照的一般步骤如下:

调用open(int)获取一个Camera的示例对象.

使用getParameters()获取Camera 的缺省配置参数.

如果有需要,调用setParameters(Camera.Parameters)修改Camera的参数.

如果有需要,可以调用setDisplayOrientation(int)设置取景为纵向或是横向。

将一个初始化过的SurfaceHolder通过setPreviewDisplay(SurfaceHolder),如果没有指定Surface,Camera将无法开始预览。

调用startPreview()开始屏幕预览,拍照之前必须先开始预览。

如需拍照可以调用takePicture(Camera.ShutterCallback, Camera.PictureCallback, Camera.PictureCallback, Camera.PictureCallback),拍照完成事件将以回调函数的方式通知应用。

拍照完成时,Camera自动停止预览状态,需调用startPreview来拍新的照片。

调用stopPreview()停止预览。

最后不在使用Camera调用release()释放资源以便其它应用可以使用Camera。

作者:mapdigit

赞助本站

人工智能实验室

相关热词: android开发 教程

AiLab云推荐
推荐内容
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港