首页 理论教育 Camera2+SurfaceView实现拍照实例优化

Camera2+SurfaceView实现拍照实例优化

时间:2023-06-27 理论教育 版权反馈
【摘要】:调用Camera.setPreviewDispaly,指定使用哪个SurfaceView来显示预览图片。调用Camera.startPreview()方法开始预览取景。CameraCharacteristics:摄像头的特性。CameraRequest表示一次捕获请求,用来对照片的各种参数进行设置,比如对焦模式、曝光模式等。CameraRequest.Builder用来生成CameraRequest对象。在Android 2.3中创建应用项目:SurfaceView_Camera2。

Camera2+SurfaceView实现拍照实例优化

Android5.0之后,Android.hardware.Camera被废弃(下面称为Camera1),由Android.hardware.Camera2代替。Camera2支持RAW输出,可以调节曝光、对焦模式、快门等,功能比原先Camera1强大。

1.Camera1

Camera1使用步骤如下。

(1)调用Camera.open(),打开相机,默认为后置相机,可以根据摄像头ID来指定打开前置还是后置相机。

(2)调用Camera.getParameters()得到一个Camera.Parameters对象。

(3)使用步骤2得到的Camera.Parameters对象,对拍照参数进行设置。

(4)调用Camera.setPreviewDispaly(SurfaceHolder holder),指定使用哪个SurfaceView来显示预览图片。

(5)调用Camera.startPreview()方法开始预览取景。

(6)调用Camera.takePicture()方法进行拍照。

(7)拍照结束后,调用Camera.stopPreview()结束取景预览,之后再调用release()方法释放资源。

2.Camera2

Camear2拍照引用了管道的概念,将安卓设备和摄像头之间联通起来,系统向摄像头发送Capture请求,而摄像头会返回CameraMetadata。这一切建立在一个叫作CameraCapture-Session的会话中,如图5-13所示。

978-7-111-58810-8-Chapter05-75.jpg

图5-13 Camera2拍照示意图

下面是camera2包中的主要类,如图5-14所示。

(1)CameraManager:摄像头管理器,用于检测摄像头,打开系统摄像头,调用Camera-

978-7-111-58810-8-Chapter05-76.jpg

图5-14 Camera2包中的主要类

Manager.getCameraCharacteristics(String),可以获取指定摄像头的相关特性。

(2)CameraCharacteristics:摄像头的特性。

(3)CameraDevice:摄像头,类似于android.hardware.Camera,也就是Camera1的Cam- era。

(4)CameraCaptureSession:控制摄像头的预览或者拍照,setRepeatingRequest()用于开启预览,capture()用于拍照,CameraCaptureSession提供了StateCallback、CaptureCallback两个接口来监听CameraCaptureSession的创建和拍照过程。

(5)CameraRequest和CameraRequest.Builder:预览或者拍照时,都需要一个CameraR-equest对象。CameraRequest表示一次捕获请求,用来对照片的各种参数进行设置,比如对焦模式、曝光模式等。CameraRequest.Builder用来生成CameraRequest对象。(www.xing528.com)

3.实现拍照

使用SurfaceView来进行展示预览,主要思路如下。

978-7-111-58810-8-Chapter05-77.jpg获得摄像头管理器CameraManagermCameraManager,应用mCameraManager.openCamera()打开摄像头。

978-7-111-58810-8-Chapter05-78.jpg指定要打开的摄像头,并创建openCamera()所需要的CameraDevice.StateCallback stateCall-back。

978-7-111-58810-8-Chapter05-79.jpg在CameraDevice.StateCallback stateCallback中调用takePreview(),在这个方法中,使用CaptureRequest.Builder创建预览需要的CameraRequest,并初始化CameraCapture-Session,最后调用了setRepeatingRequest(previewRequest,null,childHandler)进行预

览,单击屏幕,调用takePicture(),在这个方法中,最终调用capture(mCaptureRe-quest,null,childHandler)。

978-7-111-58810-8-Chapter05-80.jpg在newImageReader.OnImageAvailableListener()回调方法中,展示拍照得到的图片。具体操作步骤如下。

(1)在Android 2.3中创建应用项目:SurfaceView_Camera2。其中布局文件activity_main.xml,包含两个按钮和一个ListView控件。另一个布局文件是ListView控件的显示内容布局文件itemlayout.xml,如下所示。

978-7-111-58810-8-Chapter05-81.jpg

(2)主界面的Activity文件MainActivity.java的代码如下。

978-7-111-58810-8-Chapter05-82.jpg

978-7-111-58810-8-Chapter05-83.jpg

978-7-111-58810-8-Chapter05-84.jpg

978-7-111-58810-8-Chapter05-85.jpg

978-7-111-58810-8-Chapter05-86.jpg

978-7-111-58810-8-Chapter05-87.jpg

978-7-111-58810-8-Chapter05-88.jpg

图5-15 SurfaceViewCamera2项目的运行结果

(3)在AndroidManifest.xml文件中增加权限。

978-7-111-58810-8-Chapter05-89.jpg

(4)SurfaceView_Camera2项目的运行结果如图5-15所示。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈