Android Camera2相机使用流程讲解

news/2024/12/26 20:02:01/

引言

以前自己在APP端做自定义相机的时候,一般使用Camera1,通过camear.open+surfaceView的方式就可以很方便的实现效果。相机的拍照调用也比较方便。最近因为工作原因接触到android TV端的开发,第一代主板基于Android 4.4 通过原来Camera的使用方法能够正常的实现相机的预览,拍照功能。但是第二代主板升级到Android 5.2 系统后发现同样的代码在调用相机拍照哪里就崩溃了。(黑人问号脸?.png)于是,通过多方面的分析排查问题,最终走上了Camera2的救赎之路。现在将自己学习Camera2的经验和理解记录于此,希望能够给后来者一些启发。

 

正文

首先我们需要知道的是 camera2 API 的加入是从AndroidV5.0(21)开始的,因此我们使用Camera2应该是在Android 5.0(含5.0)之后。同时,对于Android6.0我们需要有动态权限的管理。这两点应该是使用Camera2使用前的最基本认知。

Android 5.0对拍照API进行了全新的设计,新增了全新设计的Camera v2 API,这些API不仅大幅提高了Android系统拍照的功能,还能支持RAW照片输出,甚至允许程序调整相机的对焦模式、曝光模式、快门等。下面不做过多介绍了,直接开撸了。  

 

Camera2包架构示意图

我们先来看看 camera2包架构示意图(不用一下子理解,只需要有个整体印象):

fig.1

这里引用了管道的概念将安卓设备和摄像头之间联通起来,系统向摄像头发送 Capture 请求,而摄像头会返回 CameraMetadata。这一切建立在一个叫作 CameraCaptureSession 的会话中。

下面是 camera2包中的主要类:

fig.2

 

CameraManager摄像头管理器。这是一个全新的系统管理器,专门用于检测系统摄像头、打开系统摄像头。另外,调用CameraManagergetCameraCharacteristics(String cameraId)方法即可获取指定摄像头的相关特性。

CameraCharacteristics摄像头特性。该对象通过CameraManager来获取,用于描述特定摄像头所支持的各种特性。类似与原来的CameraInfo 。

CameraDevice代表系统摄像头。该类的功能类似于早期的Camera类。而每个 CameraDevice 自己会负责建立 CameraCaptureSession 以及建立 CaptureRequest。

 

CameraCaptureSession这是一个非常重要的API,当程序需要预览、拍照时,都需要先通过该类的实例创建Session。而且不管预览还是拍照,也都是由该对象的方法进行控制的,其中控制预览的方法为setRepeatingRequest();控制拍照的方法为capture()。

为了监听CameraCaptureSession的创建过程,以及监听CameraCaptureSession的拍照过程,Camera v2 API为CameraCaptureSession提供了StateCallback、CaptureCallback等内部类。

 

CameraRequestCameraRequest.Builder当程序调用setRepeatingRequest()方法进行预览时,或调用capture()方法进行拍照时,都需要传入CameraRequest参数。CameraRequest代表了一次捕获请求,用于描述捕获图片的各种参数设置,比如对焦模式、曝光模式……总之,程序需要对照片所做的各种控制,都通过CameraRequest参数进行设置。CameraRequest.Builder则负责生成CameraRequest对象。

 

这些类是如何相互配合调用的?下面是简单的流程图。

fig.3

如果你看不太懂流程图,没关系,待会儿我们通过代码就可以更好的理解了。首先,Google官方推荐的Camera2控制拍照的步骤大致如下。

相机预览与拍照流程

1.CameraManageropenCamera(String cameraId, CameraDevice.StateCallback callback, Handler handler)方法打开指定摄像头。该方法的第一个参数代表要打开的摄像头ID;第二个参数用于监听摄像头的状态;第三个参数代表执行callback的Handler,如果程序希望直接在当前线程中执行callback,则可将handler参数设为null。

2.当摄像头被打开之后,程序即可获取CameraDevice —— 即根据摄像头ID获取了指定摄像头设备,然后调用CameraDevice的createCaptureSession(List<Surface> outputs, CameraCaptureSession. StateCallback callback,Handler handler)方法来创建CameraCaptureSession。该方法的第一个参数是一个List集合,封装了所有需要从该摄像头获取图片的Surface,第二个参数用于监听CameraCaptureSession的创建过程;第三个参数代表执行callback的Handler,如果程序希望直接在当前线程中执行callback,则可将handler参数设为null。

3.不管预览还是拍照,程序都调用CameraDevice的createCaptureRequest(int templateType)方法创建CaptureRequest.Builder,该方法支持TEMPLATE_PREVIEW(预览)、TEMPLATE_RECORD(拍摄视频)、TEMPLATE_STILL_CAPTURE(拍照)等参数。

4.通过第3步所调用方法返回的CaptureRequest.Builder设置拍照的各种参数,比如对焦模式、曝光模式等。

5.调用CaptureRequest.Builder的build()方法即可得到CaptureRequest对象,接下来程序可通过CameraCaptureSession的setRepeatingRequest()方法开始预览,或调用capture()方法拍照。

相机的预览与拍照流程我们基本了解了。

 

然后这里还有一个大招:Google官方Camera2拍照的demo的地址:点击跳转github


http://www.ppmy.cn/news/429416.html

相关文章

Android Camera2教程之打开相机、开启预览、实现PreviewCallback、拍照

转载请注明出处&#xff1a; http://blog.csdn.net/lb377463323/article/details/52740411 Android API 21新增了Camera2&#xff0c;这与之前的camera架构完全不同&#xff0c;使用起来也比较复杂&#xff0c;但是功能变得很强大。 在讲解开启预览之前&#xff0c;首先需要了…

Android 自定义相机第二次打开卡死

原因&#xff1a;相机没有被正确释放导致第二次打卡死。 //正确的释放资源代码public void release(){if (mCamera ! null) {mCamera.setPreviewCallback(null) ;mCamera.stopPreview();mCamera.release();mCamera null;}}

APP使用相机CameraX

APP使用相机 Android 开发者>文档>指南 - 选择相机库 CameraXCamera2Camera&#xff08;已废弃&#xff09; CameraX 示例应用 SampleDescriptionCameraXBasicDemonstrates how to use CameraX APIs.CameraXAdvancedDemonstrates how to use CameraX APIs with TFLite…

基于Java汽车养护管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

手机中android版本9是什么,这是Android手机Android 9.0还是Android 6.0?

我想将一些评论变成一个答案&#xff0c;该答案可用于其他验证&#xff0c;以防其他人遇到类似的问题(供应商也重新设置了通知窗口)。 Android 9.0于2018年3月发布。安全补丁程序级别为2017年5月。这根本没有意义。如果15个月大的小孩的疫苗接种卡上显示最近的疫苗接种是在他出…

贷款,借钱如何判断是否高利贷?多少利息算高利贷?

先给出认定标准&#xff0c;不超过年化利率24%&#xff0c;也就是不超过月息2分&#xff0c;都不算高利贷&#xff0c;受法律保护。 市面上的借钱途径很多&#xff0c;排除那些擦边球不正规的渠道&#xff0c;需要正规审核的贷款利息之间差别其实挺大的&#xff0c;找了一下自…

城镇、农村医保卡怎么用?弄丢了如何补办?可以给父母用吗?

“学姐学姐&#xff0c;我在旅游时生病了&#xff0c;医保还能不能报销呀” “学姐学姐&#xff0c;我在老家交了医保&#xff0c;但我长期在异地工作&#xff0c;医保还能不能用呀” “学姐学姐&#xff0c;我社保卡弄丢了怎么办呀” “学姐学姐&#xff0c;有没有什么办法可以…

真实案例详述:丢手机太危险了

点击上方“逆锋起笔”&#xff0c;公众号回复 pdf 领取大佬们推荐的学习资料 来源&#xff1a;公众号“信息安全老骆驼” 今天看到一篇文章&#xff0c;看完后真的感觉丢手机太危险了&#xff0c;大家一定要注意&#xff0c;丢手机后第一时间挂失手机卡&#xff0c;银行卡。 9月…