Android Camera2相机使用流程讲解
引言
以前自己在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包架构示意图(不用一下子理解,只需要有个整体印象):
这里引用了管道的概念将安卓设备和摄像头之间联通起来,系统向摄像头发送 Capture 请求,而摄像头会返回 CameraMetadata。这一切建立在一个叫作 CameraCaptureSession 的会话中。
下面是 camera2包中的主要类:
CameraManager:摄像头管理器。这是一个全新的系统管理器,专门用于检测系统摄像头、打开系统摄像头。另外,调用CameraManager的getCameraCharacteristics(String cameraId)方法即可获取指定摄像头的相关特性。
CameraCharacteristics:摄像头特性。该对象通过CameraManager来获取,用于描述特定摄像头所支持的各种特性。类似与原来的CameraInfo 。
CameraDevice:代表系统摄像头。该类的功能类似于早期的Camera类。而每个 CameraDevice 自己会负责建立 CameraCaptureSession 以及建立 CaptureRequest。
CameraCaptureSession:这是一个非常重要的API,当程序需要预览、拍照时,都需要先通过该类的实例创建Session。而且不管预览还是拍照,也都是由该对象的方法进行控制的,其中控制预览的方法为setRepeatingRequest();控制拍照的方法为capture()。
为了监听CameraCaptureSession的创建过程,以及监听CameraCaptureSession的拍照过程,Camera v2 API为CameraCaptureSession提供了StateCallback、CaptureCallback等内部类。
CameraRequest和CameraRequest.Builder:当程序调用setRepeatingRequest()方法进行预览时,或调用capture()方法进行拍照时,都需要传入CameraRequest参数。CameraRequest代表了一次捕获请求,用于描述捕获图片的各种参数设置,比如对焦模式、曝光模式……总之,程序需要对照片所做的各种控制,都通过CameraRequest参数进行设置。CameraRequest.Builder则负责生成CameraRequest对象。
这些类是如何相互配合调用的?下面是简单的流程图。
如果你看不太懂流程图,没关系,待会儿我们通过代码就可以更好的理解了。首先,Google官方推荐的Camera2控制拍照的步骤大致如下。
相机预览与拍照流程
1.用CameraManager的openCamera(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
Android Camera2相机使用流程讲解相关推荐
- Android Camera2 相机拍照流程详解
实现特点 实现自动对焦 选择性正常触发闪光灯flash 复用CaptureRequest.Builder, 参数完全一致 拍照注意事项讲解 代码片段详解 流程 按照常规方式打开预览 设置好相应的全局变 ...
- 十分钟实现 Android Camera2 相机拍照
1. 前言 因为工作中要使用Android Camera2 API,但因为Camera2比较复杂,网上资料也比较乱,有一定入门门槛,所以花了几天时间系统研究了下,并在CSDN上记录了下,希望能帮助到更 ...
- 详记Android打开相机拍照流程
写在前面 本文并不是基于Camera2的,所以想要了解Camera2的同学可以先散了.文题加了详记二字,因为相机整个打开的流程的确是比较复杂的,稍有疏忽可能就会引发一系列问题.我也是看了一下Andro ...
- Android Camera2相机预览画面放大缩小(数码变焦DigitalZoom)功能实现
一.前言 Android自定义相机开发中,常常会有通过手势放大或缩小相机预览画面的需求,即数码变焦DigitalZoom. 二.接口说明 1. 获取最大的放大倍数 float maxZoom = mC ...
- android sse 人脸识别,基于Android Camera2之openCamera 流程
简介 frameworks\base\core\java\android\hardware\camera2 Camera2在Android 5.0上首次出现,主要重新定义了一套Camera 的使用接口 ...
- Android Camera2 相机预览、获取数据
Camera2简要说明 在Google 推出Android 5.0的时候, Android Camera API 版本升级到了API2(android.hardware.camera2),大幅提高了A ...
- Android 自定义相机Camera流程
demo 下载 android Camera 如何 获取最佳合适的尺寸 1.如何利用 Camera 开发自定义相机? a.Camera.getNumberOfCameras() 获取 相机数目返回一个 ...
- Android: Camera2相机开发 知识储备
进行Camera开发主要用到了以下两个类: 1.Camera 2.TexttureView(也可以是SurfaceView) 一.Surface Surfaces是用来处理屏幕显示内容合成器所管理的原 ...
- Camera2相机拍照流程之拍照功能梳理
/*** 拍照时调用方法*/ private void captureStillPicture() {try {if (mCameraDevice == null) {return;}// 创建作为拍 ...
最新文章
- MySQL安装失败出现could not start the service mysql error:0 错误提示
- 主线程和子线程的同步控制
- java 的集合说明
- 【Android】SDDL刷机
- Oracle数据库基本概念理解(2)
- ServletActionContext.getRequest().getSession() 和 ActionContext.getContext().getSession()的区别
- idea 内存溢出解决方法
- leetcode 381. O(1) 时间插入、删除和获取随机元素 - 允许重复
- sap的ides和ecc分别是什么意思
- mysql 创建表 引号_Mysql建表语句中显示双引号的方法介绍
- 固定编辑框输入上限和下限_两种截然不同的汉字输入场景
- 我可以在目录中放入多少个文件?
- C# 各种常用集合类型的线程安全版本
- javaweb springboot餐厅点餐系统源码
- jQuery视频和图片轮播js特效
- matlab普朗克黑体辐射公式,MATLAB 黑体辐射规律的研究详解.doc
- CV中domain adaptation领域自适应问题
- BLM业务模式设计之战略控制
- 南理工计算机科学与工程学院,周俊龙 - 南京理工大学 - 计算机科学与工程学院...
- php图片无损压缩的问题解决(推荐)
热门文章
- Mybatis框架专辑
- 重构TabControl
- 计算机数字书写制作过程,凹印日字符,规范阿拉伯数字的书写制造技术
- android仿qq强制下线服务器,qq强制下线(实现一个类似QQ的强制下线功能)
- 港联证券|“牛市旗手”频遭股东减持 机构仍看好板块后市表现
- Testin云测(100款兼容测试+安全测试)
- gin框架之获取URL参数
- 驰骋工作流-CCFlow JFlow钉钉集成配置说明
- 破茧成蝶1:设计流程——设计师具体做什么?
- 高校房产信息管理中管理教职工住宅和周转房有什么不一样?