引言

以前自己在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.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

Android Camera2相机使用流程讲解相关推荐

  1. Android Camera2 相机拍照流程详解

    实现特点 实现自动对焦 选择性正常触发闪光灯flash 复用CaptureRequest.Builder, 参数完全一致 拍照注意事项讲解 代码片段详解 流程 按照常规方式打开预览 设置好相应的全局变 ...

  2. 十分钟实现 Android Camera2 相机拍照

    1. 前言 因为工作中要使用Android Camera2 API,但因为Camera2比较复杂,网上资料也比较乱,有一定入门门槛,所以花了几天时间系统研究了下,并在CSDN上记录了下,希望能帮助到更 ...

  3. 详记Android打开相机拍照流程

    写在前面 本文并不是基于Camera2的,所以想要了解Camera2的同学可以先散了.文题加了详记二字,因为相机整个打开的流程的确是比较复杂的,稍有疏忽可能就会引发一系列问题.我也是看了一下Andro ...

  4. Android Camera2相机预览画面放大缩小(数码变焦DigitalZoom)功能实现

    一.前言 Android自定义相机开发中,常常会有通过手势放大或缩小相机预览画面的需求,即数码变焦DigitalZoom. 二.接口说明 1. 获取最大的放大倍数 float maxZoom = mC ...

  5. android sse 人脸识别,基于Android Camera2之openCamera 流程

    简介 frameworks\base\core\java\android\hardware\camera2 Camera2在Android 5.0上首次出现,主要重新定义了一套Camera 的使用接口 ...

  6. Android Camera2 相机预览、获取数据

    Camera2简要说明 在Google 推出Android 5.0的时候, Android Camera API 版本升级到了API2(android.hardware.camera2),大幅提高了A ...

  7. Android 自定义相机Camera流程

    demo 下载 android Camera 如何 获取最佳合适的尺寸 1.如何利用 Camera 开发自定义相机? a.Camera.getNumberOfCameras() 获取 相机数目返回一个 ...

  8. Android: Camera2相机开发 知识储备

    进行Camera开发主要用到了以下两个类: 1.Camera 2.TexttureView(也可以是SurfaceView) 一.Surface Surfaces是用来处理屏幕显示内容合成器所管理的原 ...

  9. Camera2相机拍照流程之拍照功能梳理

    /*** 拍照时调用方法*/ private void captureStillPicture() {try {if (mCameraDevice == null) {return;}// 创建作为拍 ...

最新文章

  1. MySQL安装失败出现could not start the service mysql error:0 错误提示
  2. 主线程和子线程的同步控制
  3. java 的集合说明
  4. 【Android】SDDL刷机
  5. Oracle数据库基本概念理解(2)
  6. ServletActionContext.getRequest().getSession() 和 ActionContext.getContext().getSession()的区别
  7. idea 内存溢出解决方法
  8. leetcode 381. O(1) 时间插入、删除和获取随机元素 - 允许重复
  9. sap的ides和ecc分别是什么意思
  10. mysql 创建表 引号_Mysql建表语句中显示双引号的方法介绍
  11. 固定编辑框输入上限和下限_两种截然不同的汉字输入场景
  12. 我可以在目录中放入多少个文件?
  13. C# 各种常用集合类型的线程安全版本
  14. javaweb springboot餐厅点餐系统源码
  15. jQuery视频和图片轮播js特效
  16. matlab普朗克黑体辐射公式,MATLAB 黑体辐射规律的研究详解.doc
  17. CV中domain adaptation领域自适应问题
  18. BLM业务模式设计之战略控制
  19. 南理工计算机科学与工程学院,周俊龙 - 南京理工大学 - 计算机科学与工程学院...
  20. php图片无损压缩的问题解决(推荐)

热门文章

  1. Mybatis框架专辑
  2. 重构TabControl
  3. 计算机数字书写制作过程,凹印日字符,规范阿拉伯数字的书写制造技术
  4. android仿qq强制下线服务器,qq强制下线(实现一个类似QQ的强制下线功能)
  5. 港联证券|“牛市旗手”频遭股东减持 机构仍看好板块后市表现
  6. Testin云测(100款兼容测试+安全测试)
  7. gin框架之获取URL参数
  8. 驰骋工作流-CCFlow JFlow钉钉集成配置说明
  9. 破茧成蝶1:设计流程——设计师具体做什么?
  10. 高校房产信息管理中管理教职工住宅和周转房有什么不一样?