Android使用Camera2 替代过时的Camera API

因为考虑到想要新增新的5.0以上的Camera2 API,发现变得太多,有重构的意思,还好先发现了这篇文章,目前对5.0以下的版本都没有兼容包和支持,所以建议按照文中最后一条做一下API版本判断

以下文章出自:
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0428/2811.html#badfb4523

英文原文:
https://forums.developer.amazon.com/articles/2707/using-camera2-to-replace-deprecated-camera-api.html

概要

从5.0开始(API Level 21),可以完全控制安卓设备相机的新api Camera2(android.hardware.Camera2)被引入了进来。在以前的Camera api(android.hardware.Camera)中,对相机的手动控制需要更改系统才能实现,而且api也不友好。不过老的Camera API在5.0上已经过时,在未来的app开发中推荐的是Camera2 API。

L版本之前的Camera API

  • 有限的图片数据流获取方式
  • 有限相机状态信息
  • 没有手动捕获控制

Camera2 API

  • Supports 30fps full resolution with burst mode

    支持30fps的全高清连拍

  • Supports change on manual camera settings between frame capture

    支持帧之间的手动设置

  • Supports RAW image capture

    支持RAW格式的图片拍摄

  • Supports Zero Shutter Lag & Movie Snapshot

    支持快门0延迟以及电影速拍

  • Supports setting other manual camera device controls including level of Noise Cancelling

    支持相机其他方面的手动控制包括噪音消除的级别

相机的基本使用被分成了5个主要部分

  1. CameraManager
  2. CameraDevice
  3. CameraCaptureSession
  4. CaptureRequest
  5. CaptureResult

CameraManager:

  • 提供构建,列出以及链接相机设备的接口

    http://developer.android.com/reference/android/hardware/camera2/CameraManager.html

    CameraDevice:

  • 代表和安卓设备相连的单个相机

    http://developer.android.com/reference/android/hardware/camera2/CameraDevice.html

  • CameraCaptureSession:

    提供一套输出目标的

  • surface(TextureView,MediaRecorder,MediaCodec,ImageReader,RenderScriptAllocation)。

    http://developer.android.com/reference/android/hardware/camera2/CameraCaptureSession.html

  • CaptureRequest:

    • Settings and outputs needed to capture a single image from the camera device
    • Create request builder by predefined templates(TEMPLATE_PREVIEW, TEMPLATE_RECORD, TEMPLATE_STILL_CAPTURE, TEMPLATE_VIDEO_SNAPSHOT, TEMPLATE_MANUAL)
    • This requests are given to capture or setRepeatingRequest to capture images from the camera
    • http://developer.android.com/reference/android/hardware/camera2/CaptureRequest.html
  • CaptureResult:

    从图像传感器获得的单个图片拍摄的结果。

    http://developer.android.com/reference/android/hardware/camera2/CaptureResult.html

  • 更详细的内容,需要通读Camera2包的概要介绍页

    http://developer.android.com/reference/android/hardware/camera2/package-summary.html

  • 还有一个YouTube上的谷歌开发者的介绍视频,解释了Camera2 API的改动:DevBytes:Android L开发者预览之- Camera2 API

    https://www.youtube.com/watch?v=Xtp3tH27OFs

你需要记住在安卓设备上,Camera2 API的所有特性并不都总是可用的。取决于设备本身。为了检查那些特性可用,可以使用CameraCharacteristics来获得支持信心。

  • characteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL);

    返回的结果分为级别的相机功能,按照 全支持> 有限支持> 看心情赠送的顺序排列:

  • INFO_SUPPORTED_HARDWARE_LEVEL_FULL

    全方位的硬件支持,允许手动控制全高清的摄像。如果返回的是这个,连拍模式以及其他新特性都是可用的。https://developer.android.com/reference/android/hardware/camera2/CameraCharacteristics.html#INFO_SUPPORTED_HARDWARE_LEVEL

  • INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED

    一个“有限支持”的设备可能有一些或者没有“全支持”设备的特性。有些特性可能不属于任何硬件级别,需要单独查询。

    https://developer.android.com/reference/android/hardware/camera2/CameraCharacteristics.html#INFO_SUPPORTED_HARDWARE_LEVEL

  • INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY

    所有的设备都会有的特性。这和过时的Camera API所支持的特新是一样的。

    https://developer.android.com/reference/android/hardware/camera2/CameraCharacteristics.html#INFO_SUPPORTED_HARDWARE_LEVEL

虽然推荐在未来的app中使用Camera2 API,但是只有Lollipop的设备商才可用,也不大可能会出现兼容老设备的包。因此在最小版本(minSdkVersion)升到21之前,你还是需要继续使用Camera API(android.hardware.Camera)。

不过你可以用下面的代码对不同的版本区别对待

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
    // your code using Camera API here - is between 1-20
} else if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    // your code using Camera2 API here - is api 21 or higher
}

最后,在网上发现几个使用Camera API2开发的实例程序,总结一下方便后续参考:

  1. Camera2 Basic : https://github.com/googlesamples/android-Camera2Basic
    演示如何使用Camera2 API基本功能的demo。你可以从中学会如何遍历相机设备的所有特性,显示预览照片,以及拍照。

  2. Camera2 Video:https://github.com/googlesamples/android-Camera2Video
    这个demo演示如何使用Camera2 API录制视频。

  3. Camera2 master: http://www.eyesourcecode.com/thread-35378-1-1.html
    使用Android L Camera2 API开发的示例应用程序,具备拍照,AWB,Flash,连拍功能

  4. LCamera http://www.eyesourcecode.com/thread-35377-1-1.html
    L Camera是一个开源的实验性质的Camera应用程序,基于Android L提供的新API android.hardware.camera2,目前只支持在Andorid 5.0 Lollipop版本的Nexus 5和Nexus 6上运行。

你可能感兴趣的:(Android,Camera)