CameraX — 一个 Android Jetpack 相机库,在复杂的 Camera2 之上提供简单一致的 API。它抽象了数百种 Android 设备型号之间的差异,并保证不同设备上相机的相同行为。根据 Android Developer CameraX Guide (2026),该库被 25,000+ 个 Google Play 应用使用,并可在 API Level 21 及更高版本的设备上运行。
要点
CameraX — 是 Android Jetpack 中的一个库,由 Google 于 2019 年首次发布,作为旧版 Camera API 的替代品和复杂 Camera2 的简化替代方案。CameraX 的主要理念是「一次编写,在所有设备上运行」。该库自动处理硬件差异:相机位置、支持的分辨率、传感器方向和可用格式 — 开发者无需编写设备特定代码。
CameraX 架构基于 use case:Preview(在 Viewfinder 中显示相机图像)、ImageCapture(拍照)、ImageAnalysis(分析帧流以用于 ML)和 VideoCapture(录制视频)。每个 use case 都是独立的组件,可以进行组合:同时运行 Preview 用于取景器和 ImageAnalysis 用于 ML 处理。根据 Google(2026)的数据,CameraX 在 99% 的 Android 设备(API 21+)上受支持。
CameraX 提供前后摄像头自动切换、无需重新创建会话的屏幕旋转支持、通过 LifecycleOwner 的内置生命周期处理、将 use cases 绑定到单个 Lifecycle 过程、对 Camera2 Extensions 的支持(用于人像、HDR 和夜间模式),以及用于无需真实设备的单元测试的 TestableCameraX。
CameraX 定义了四个标准 use case,每个解决一个特定的相机任务。Use cases 可以组合:最流行的组合是 Preview + ImageCapture 用于相机和 Preview + ImageAnalysis 用于 ML 扫描仪。
| Use case | 用途 | 类 |
|---|---|---|
| Preview | 实时显示相机图像 | PreviewView |
| ImageCapture | 使用闪光灯和分辨率设置拍照 | ImageCapture |
| ImageAnalysis | 分析每一帧以进行 ML 处理 | ImageAnalysis |
| VideoCapture | 使用麦克风录制视频(从 1.1.0-beta 开始) | VideoCapture |
Preview use case 在 PreviewView 中显示来自相机的视频流 — 来自 CameraX 库的特殊 View。PreviewView 自动适应相机纵横比,支持 ScaleType(FillCenter、FitCenter)和无需重新创建 use case 的屏幕旋转。开发者只需通过 ProcessCameraProvider 将 Preview 绑定到 Lifecycle。
ImageAnalysis use case 将来自相机的每一帧传递给处理器进行分析:文本识别、人脸检测、二维码扫描。分析器以 YUV_420_888 格式接收帧 — Android 的通用色彩空间。工作模式(BLOCKING 或 NON_BLOCKING)管理帧队列:BLOCKING 等待前一个分析完成,NON_BLOCKING 在延迟时跳过帧。
ImageCapture use case 使用闪光灯、分辨率和压缩设置从相机拍照。支持 JPEG 和 RAW 格式(在兼容设备上)。ImageCapture 通过 OnImageCapturedCallback 异步保存照片,或通过 ImageCapture.OutputFileOptions 直接保存到文件。
VideoCapture use case 在 CameraX 1.1.0(测试版)中添加,允许以高达 4K 分辨率(30 FPS)录制视频。Use case 自动与 Preview 同步:取景器中的图像与录制到文件中的内容一致。VideoCapture 内部使用 MediaCodec 和 MediaMuxer,隐藏了视频编解码器和 MP4 容器配置的复杂性。
CameraX 和 Camera2 — 在 Android 中使用相机的两种方法。Camera2 — 低级 API,提供对设备的完全控制。CameraX — 高级抽象,自动化典型场景。两者之间的选择取决于项目需求。
| 特性 | CameraX | Camera2 |
|---|---|---|
| API 级别 | 高级(use case) | 低级(完全控制) |
| 设备特定代码 | 不需要 | 每个设备都需要 |
| 绑定到 Lifecycle | 自动 | 手动 |
| 扩展 | 内置(HDR、Portrait、Night) | 需要 OEM 实现 |
| 实现复杂度 | 15–30 行代码 | 100–300 行代码 |
| API 支持 | API 21+ | API 21+ |
| 灵活性 | 标准场景 | 任意场景 |
对于标准任务使用 CameraX:应用中的相机、二维码扫描仪、ML 流处理。当需要手动曝光控制、完全参数控制的 RAW 拍摄、同时使用多个相机时使用 Camera2。
让我们看看 CameraX 在 Android 应用中使用所有三个主要 use case 的完整配置:Preview、ImageCapture 和 ImageAnalysis。
代码通过 ProcessCameraProvider 将 CameraX 绑定到 Activity 的 Lifecycle。首先请求 provider 实例,然后创建 use cases 并执行绑定。
val cameraProviderFuture =
ProcessCameraProvider.getInstance(this)
cameraProviderFuture.addListener({
val cameraProvider = cameraProviderFuture.get()
// 创建 Preview
val preview = Preview.Builder()
.build()
.also {
it.setSurfaceProvider(
binding.viewFinder.surfaceProvider
)
}
// 创建 ImageCapture
val imageCapture = ImageCapture.Builder()
.setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY)
.build()
// 绑定到 Lifecycle
cameraProvider.unbindAll()
cameraProvider.bindToLifecycle(
this,
CameraSelector.DEFAULT_BACK_CAMERA,
preview,
imageCapture
)
}, ContextCompact.getMainExecutor(this))
Kotlin 代码通过 future 获取 ProcessCameraProvider,创建 Preview 和 ImageCapture use cases,并将它们绑定到当前 Activity 的 Lifecycle。CameraX 自动处理屏幕旋转、相机切换和 Activity 关闭时的资源释放。
添加 ImageAnalysis use case 用于逐帧处理来自相机的流,例如与 ML Kit 集成。
val imageAnalysis = ImageAnalysis.Builder()
.setBackpressureStrategy(
ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST
)
.build()
imageAnalysis.setAnalyzer(
ContextCompact.getMainExecutor(this)
) { imageProxy ->
// 将 YUV 转换为 Bitmap 以用于 ML Kit
val bitmap = ImageUtils.yuvToBitmap(imageProxy)
val inputImage = InputImage.fromBitmap(bitmap)
// 启动 ML Kit 文本识别
recognizer.process(inputImage)
.addOnSuccessListener { result ->
// 处理结果
processTextResult(result)
}
.addOnCompleteListener {
imageProxy.close()
}
}
使用 KEEP_ONLY_LATEST 策略 的 ImageAnalysis 只处理最后一个可用帧,如果分析器跟不上则跳过过时的帧。每个帧从 YUV 转换为 Bitmap 以用于 ML Kit,然后启动文本识别。调用 imageProxy.close() 是强制性的 — 否则 CameraX 将停止提供新帧。
CameraX Extensions — 添加高级拍摄模式的模块:人像(背景模糊)、HDR(扩展动态范围)、夜间模式(弱光拍摄)、自动修饰(皮肤校正)和「美颜」(beauty) 模式。扩展仅在相机制造商提供 OEM 实现的设备上激活。
在使用 CameraX Extensions 之前,需要检查当前设备上是否可用该扩展。Google 建议通过 ExtensionsManager.isExtensionAvailable 进行检查。
val extensionsManager =
ExtensionsManager.getInstance(this)
if (extensionsManager.isExtensionAvailable(
cameraProvider,
CameraSelector.DEFAULT_BACK_CAMERA,
ExtensionMode.BOKEH
)) {
// 启用人像模式
cameraProvider.bindToLifecycle(
this,
CameraSelector.DEFAULT_BACK_CAMERA,
preview,
imageCapture
)
}
代码通过 ExtensionsManager 检查 BOKEH(人像)扩展的支持,并在有 OEM 实现时启用它。CameraX 自动将相机设置切换为人像模式。如果扩展不可用,应用程序继续在标准模式下运行而不会崩溃。
CameraX Extensions 解决了 Android 开发的主要问题之一:相机碎片化。在不同设备上,人像模式的实现方式不同 — 有些使用双镜头,有些使用软件模糊。CameraX 抽象了这种差异:开发者启用 BOKEH 模式,库本身决定如何在特定设备上实现它。Google 维护已验证的 OEM 合作伙伴列表:Samsung、Xiaomi、OPPO、vivo、Google Pixel。
在使用 CameraX 时,重要的是要考虑同时 use case 的数量限制:在大多数设备上,最多可以同时运行 3 个 use case。例如,Preview + ImageCapture + ImageAnalysis 在所有现代设备上都能工作,但 Preview + ImageCapture + VideoCapture 可能在廉价型号上不受支持。CameraX 提供了 ProcessCameraProvider.checkAvailability() 方法,在绑定前检查 use case 组合的兼容性,从而避免运行时崩溃。
CameraX 通过 CameraXFragment 或 Compose 兼容的 PreviewView 与 Jetpack Navigation 集成。对于 Compose,使用嵌入 PreviewView 的 AndroidView 元素。CameraX 正确处理屏幕旋转和配置更改而不会丢失相机会话状态 — 只需指定 LifecycleOwner,库会在设备旋转时自动重新创建 use case 绑定。
为了在无真实设备的情况下测试 CameraX,Google 提供了 TestableCameraX — 在单元测试中模拟相机行为的库。TestableCameraX 允许模拟相机帧、检查 ImageAnalysis 的工作和 ImageCapture 处理的正确性而无需物理设备。这显著加速了相机相关项目的 CI/CD 管道。
常见问题
Android 5.0 (API 21) 及以上版本。CameraX 覆盖 99% 的活跃 Android 设备。对于扩展(Portrait、HDR)需要 API 23+ 和特定模式的 OEM 支持。
可以,ImageAnalysis use case 将每一帧传递给分析器。帧从 YUV_420_888 转换为 InputImage 以用于 ML Kit。这是创建 ML 扫描仪的标准模式。
CameraX — 高级 API,具有 use case 架构、自动 Lifecycle 绑定和处理设备特定差异。Camera2 — 低级完全控制相机,带有大量样板代码。
支持,VideoCapture use case 在 CameraX 1.1.0-beta 中添加。使用麦克风录制视频并与 Preview 同步。对于更复杂的场景,直接使用 Camera2。
通过 CameraSelector:DEFAULT_BACK_CAMERA 或 DEFAULT_FRONT_CAMERA。要切换,使用新的选择器调用 cameraProvider.bindToLifecycle() — CameraX 会自动重启会话。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。