Android Jetpack CameraX 库 Beta 版正式发布!
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
CameraX 概览
作为 Jetpack 库,CameraX 不仅仅兼容 API level 21 及以上的 Android 设备,并且与各种硬件设备相兼容,开发者们无需关心具体的设备形态、相机配置或者设备的实现细节。
CameraX 的一个核心属性是它可感知生命周期。相较于手动打开或关闭相机,我们将相机的调用交给具有生命周期的对象,当这些对象 (如 Activity、Fragment 等) 启动或者停止的时候,同时会启动或者停止相机。
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
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> =
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()
这并不属于 Beta 版本推出的内容,PreviewView 已经于 alpha08 版本中加入,通过 PreviewView 来实现相机预览的功能是我们推荐的使用方式。要使用它,首先将它添加到您的 XML 布局文件中:
<androidx.camera.view.PreviewView
android:layout_width=”match_parent”
android:layout_height=”match_parent”/>
然后确保您的 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<ZoomState> = camera.cameraInfo.zoomState
val torchState: LiveData<Int> = 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...)
val camera = cameraProvider.bindToLifecycle(…)
camera.cameraControl.enableTorch(true)
camera.cameraControl.setLinearZoom(0.5f)
camera.cameraControl.startFocusAndMetering(…)
下一步
继续 CameraX 测试套件的开发; 在自动化测试农场中增加新的设备; 解决内部和外部提交的 bug。
详细了解 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/
想了解更多 Android 内容?
在公众号首页发送关键词 "Android",获取相关历史技术文章;
在公众号首页发送关键词 "ADS",获取开发者峰会演讲中文字幕视频;
还有更多疑惑?欢迎点击菜单 "联系我们" 反馈您在开发过程中遇到的问题。
推荐阅读