当前位置:操作系统 > 安卓/Android >>

Android ApiDemos示例解析(57):Graphics->CameraPreview

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

 \

例子中用到两个方面的知识:Su易做图ceView 和android.hardware.Camera。

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

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

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

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

下面代码定义了Su易做图ceView子类并实现Su易做图ceHolder.Callback接口。

[java] 
class Preview extends Su易做图ceView implements Su易做图ceHolder.Callback {  
 Su易做图ceHolder mHolder;  
 Camera mCamera;  
...  
public void su易做图ceCreated(Su易做图ceHolder holder) {  
 // The Su易做图ce 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 su易做图ceDestroyed(Su易做图ceHolder holder) {  
 // Su易做图ce 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 su易做图ceChanged(Su易做图ceHolder 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 Su易做图ceView implements Su易做图ceHolder.Callback {
 Su易做图ceHolder mHolder;
 Camera mCamera;
...
public void su易做图ceCreated(Su易做图ceHolder holder) {
 // The Su易做图ce 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 su易做图ceDestroyed(Su易做图ceHolder holder) {
 // Su易做图ce 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 su易做图ceChanged(Su易做图ceHolder 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)设置取景为纵向或是横向。
将一个初始化过的Su易做图ceHolder通过setPreviewDisplay(Su易做图ceHolder),如果没有指定Su易做图ce,Camera将无法开始预览。
调用startPreview()开始屏幕预览,拍照之前必须先开始预览。
如需拍照可以调用takePicture(Camera.ShutterCallback, Camera.PictureCallback, Camera.PictureCallback, Camera.PictureCallback),拍照完成事件将以回调函数的方式通知应用。
拍照完成时,Camera自动停止预览状态,需调用startPreview来拍新的照片。
调用stopPreview()停止预览。
最后不在使用Camera调用release()释放资源以便其它应用可以使用Camera。
作者:mapdigit
 

补充:移动开发 , Android ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,