Android Jetpack CameraX 库 Beta 版正式发布!

Android Jetpack CameraX 库 Beta 版正式发布!_第1张图片

CameraX 是一个 Jetpack 支持库,旨在帮助您简化相机应用的开发工作。它提供一致且易于使用的 API 界面,适用于大多数 Android 设备,并可向后兼容至 Android 5.0 (API 级别 21)。

 

CameraX 的 Beta 版本正式发布,我们向为此作出贡献的全体开发者社区成员致谢,这是我们共同努力的结果。这次的版本将为开发者呈现一个基础的相机 API,未来会一如既往地提供与兼容性有关或其他 bug 的修复程序和解决方法,助力您在多台设备上打造一致的开发者体验。

除了在自动化测试农场扩大测试范围,有很多应用也在生产环境中使用了 CameraX 库,这使得我们有信心向各位开发者推荐 CameraX,推荐大家开始尝试并将基于 CameraX 的应用发布到应用商店。我们也预想到可能会出现一些 bug,但是我们会及时处理各种问题,来帮助大家实现最佳的相机使用体验。如果您需要帮助,可以通过 Google Groups 讨论群组或者新建一个 issue 来向我们反馈。

本文我们会向大家简要介绍 Android Jetpack 组件中的 CameraX 库,以及 Beta 版本中的更新。Beta 版本意味着该版本的 Jetpack 库已经可以面向生产环境,但仍会有一些非关键的 bug 的存在。

请参阅官方文档以及官方示例代码以获取最新资源,并加入我们的线上开发者社区。

  • Google Groups 讨论群组

    https://groups.google.com/a/android.com/forum/#!forum/camerax-developers

  • 新建一个 issue

    http://issuetracker.google.com/

  • 官方文档

    https://developer.android.google.cn/training/camerax

  • 官方示例代码

    https://github.com/android/camera-samples/tree/master/CameraXBasic

  • 线上开发者社区

    https://groups.google.com/a/android.com/forum/#!forum/camerax-developers

Android Jetpack CameraX 库 Beta 版正式发布!_第2张图片

CameraX logo

CameraX 概览

首先,让我们通过视频快速了解一下 CameraX 是什么,如果您已经熟悉 CameraX,那么可以跳过本节。

设备兼容性

作为 Jetpack 库,CameraX 不仅仅兼容 API level 21 及以上的 Android 设备,并且与各种硬件设备相兼容,开发者们无需关心具体的设备形态、相机配置或者设备的实现细节。

生命周期感知能力

CameraX 的一个核心属性是它可感知生命周期。相较于手动打开或关闭相机,我们将相机的调用交给具有生命周期的对象,当这些对象 (如 Activity、Fragment 等) 启动或者停止的时候,同时会启动或者停止相机。

CameraX 用例

Beta 版本的 CameraX 所提供的用例主要包含:

  • Preview: 用于显示一个取景器 (viewfinder),来预览当前相机所拍到的图像;

  • ImageAnalysis: 用于解析相机采集到的数据流;

  • ImageCapture: 用于拍摄高质量照片。

  • 可感知生命周期

    https://developer.android.google.cn/topic/libraries/architecture/lifecycle

  • Preview

    https://developer.android.google.cn/training/camerax/preview

  • ImageAnalysis

    https://developer.android.google.cn/training/camerax/analyze

  • ImageCapture

    https://developer.android.google.cn/training/camerax/take-photo

Android Jetpack CameraX 库 Beta 版正式发布!_第3张图片

△ 人像模式

Beta 版本里的改变

和我们上次聊 CameraX 时相比,Beta 版本有一些新的变化,这些变化可以在官方文档、官方示例代码或者线上开发者社区里找到。

  • 官方文档

    https://developer.android.google.cn/training/camerax

  • 官方示例代码

    https://github.com/android/camera-samples/tree/master/CameraXBasic

  • 线上开发者社区

    https://groups.google.com/a/android.com/forum/#!forum/camerax-developers

初始化

开发者需要通过 ProcessCameraProvider 来初始化 CameraX,代码示例如下:

val cameraProviderFuture: ListenableFuture =
    ProcessCameraProvider.getInstance(context)
// 当 future 的值就绪以后,会触发该监听器
cameraProviderFuture.addListener(Runnable {
    // 现在可以保证这里的 cameraProvider 是可用的
    val cameraProvider = cameraProviderFuture.get()
    …
}, executor)
  • ProcessCameraProvider

    https://developer.android.google.cn/reference/androidx/camera/lifecycle/ProcessCameraProvider

相机选取

在本用例中,选择所需的相机是通过 CameraSelector 实现的。首先使用一组可选的约束参数创建一个 CameraSelector 对象,然后 CameraX 会选择最符合约束条件的可用相机:

val cameraSelector = CameraSelector.Builder()
    .requireLensFacing(CameraSelector.LENS_FACING_BACK)
    .build()

如果您希望能够启用前置或者后置相机,可以使用这两个静态字段 

CameraSelector.DEFAULT_FRONT_CAMERA 

或者

CameraSelector.DEFAULT_BACK_CAMERA。

请在 CameraSelector 文档查阅更多资料: 

https://developer.android.google.cn/reference/androidx/camera/core/CameraSelector

相机预览

这并不属于 Beta 版本推出的内容,PreviewView 已经于 alpha08 版本中加入,通过 PreviewView 来实现相机预览的功能是我们推荐的使用方式。要使用它,首先将它添加到您的 XML 布局文件中:

 

然后确保您的 Preview 用例使用的是 PreviewView 的 surface 对象:

val preview: Preview = …
val viewFinder: PreviewView = … // 比如 findViewById()
preview.setSurfaceProvider(viewFinder.previewSurfaceProvider)

如果您想使用自己的 Surface 对象 (比如通过 TextureView 得到),那么您需要自行实现 surface provider,同时确保能够正确处理尺寸和设备朝向,有时这两项处理起来会很棘手。

  • PreviewView

    https://developer.android.google.cn/reference/androidx/camera/view/PreviewView

  • surface provider

    https://developer.android.google.cn/training/camerax/preview#manual

相机控制

您可以使用 CameraProcessProvider.bindToLifecycle() 返回的相机对象,来查询和修改相机的某些功能,如对焦、变焦和闪光灯。您可以通过 CameraInfo 对象获取内含相机当前状态的 LiveData 对象,如以下代码示例所示:

val camera = cameraProvider.bindToLifecycle(…)
val zoomState: LiveData = camera.cameraInfo.zoomState
val torchState: LiveData = camera.cameraInfo.torchState
  • CameraProcessProvider.bindToLifecycle()

    https://developer.android.google.cn/reference/androidx/camera/lifecycle/ProcessCameraProvider#bindToLifecycle(androidx.lifecycle.LifecycleOwner,%20androidx.camera.core.CameraSelector,%20androidx.camera.core.UseCase...)

反之,您可以通过相应的 CameraControl 对象来控制这些值:

val camera = cameraProvider.bindToLifecycle(…)
camera.cameraControl.enableTorch(true)
camera.cameraControl.setLinearZoom(0.5f)
camera.cameraControl.startFocusAndMetering(…)

下一步

相机开发并非易事,我们会从以下几个方面提高 CameraX 易用性:

  • 继续 CameraX 测试套件的开发;

  • 在自动化测试农场中增加新的设备;

  • 解决内部和外部提交的 bug。

开始使用 CameraX Beta 并和我们一起改善用户在 Android 上的相机体验吧。

详细了解 CameraX,请参阅以下资源:

  • 官方文档

    http://developer.android.google.cn/camerax

  • 官方示例代码

    https://github.com/android/camera-samples/tree/master/CameraXBasic

  • Google Groups 讨论群租

    https://groups.google.com/a/android.com/forum/#!forum/camerax-developers


我们也在去年的 Android 开发者峰会中与大家分享了 CameraX 库的介绍和用法,请查看下面的视频回顾:

  • 腾讯视频链接

    https://v.qq.com/x/page/n30296o11ts.html

  • Bilibili 视频链接

    https://www.bilibili.com/video/av77914655/

 点击屏末  | 了解更多 CameraX 相关内容

 想了解更多 Android 内容?

  • 在公众号首页发送关键词 "Android",获取相关历史技术文章;

  • 在公众号首页发送关键词 "ADS",获取开发者峰会演讲中文字幕视频;

  • 还有更多疑惑?欢迎点击菜单 "联系我们" 反馈您在开发过程中遇到的问题。

推荐阅读



你可能感兴趣的:(Android Jetpack CameraX 库 Beta 版正式发布!)