CameraX:是什么、CameraX API 及相机如何工作

作者: IT Sectr 发布日期: 2026-03-26 阅读时间: 8 分钟

CameraX — 一个 Android Jetpack 相机库,在复杂的 Camera2 之上提供简单一致的 API。它抽象了数百种 Android 设备型号之间的差异,并保证不同设备上相机的相同行为。根据 Android Developer CameraX Guide (2026),该库被 25,000+ 个 Google Play 应用使用,并可在 API Level 21 及更高版本的设备上运行。

要点

  • CameraX — 用于 Android 相机的 Jetpack 库,具有 use case API:Preview、ImageCapture 和 ImageAnalysis
  • Use case 架构 使开发者无需手动管理会话和相机状态
  • CameraX Extensions 在支持的设备上添加人像模式、HDR 和夜间拍摄
  • 类型安全 — CameraX 通过 ProcessCameraProvider 检查 use cases 的兼容性
  • 兼容性 从 Android 5.0 (API 21) 开始覆盖 99% 的 Android 设备

什么是 CameraX?

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 cases

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

Preview use case 在 PreviewView 中显示来自相机的视频流 — 来自 CameraX 库的特殊 View。PreviewView 自动适应相机纵横比,支持 ScaleType(FillCenter、FitCenter)和无需重新创建 use case 的屏幕旋转。开发者只需通过 ProcessCameraProvider 将 Preview 绑定到 Lifecycle。

ImageAnalysis

ImageAnalysis use case 将来自相机的每一帧传递给处理器进行分析:文本识别、人脸检测、二维码扫描。分析器以 YUV_420_888 格式接收帧 — Android 的通用色彩空间。工作模式(BLOCKING 或 NON_BLOCKING)管理帧队列:BLOCKING 等待前一个分析完成,NON_BLOCKING 在延迟时跳过帧。

ImageCapture

ImageCapture use case 使用闪光灯、分辨率和压缩设置从相机拍照。支持 JPEG 和 RAW 格式(在兼容设备上)。ImageCapture 通过 OnImageCapturedCallback 异步保存照片,或通过 ImageCapture.OutputFileOptions 直接保存到文件。

VideoCapture — 录制视频

VideoCapture use case 在 CameraX 1.1.0(测试版)中添加,允许以高达 4K 分辨率(30 FPS)录制视频。Use case 自动与 Preview 同步:取景器中的图像与录制到文件中的内容一致。VideoCapture 内部使用 MediaCodec 和 MediaMuxer,隐藏了视频编解码器和 MP4 容器配置的复杂性。

CameraX 与 Camera2 对比

CameraX 和 Camera2 — 在 Android 中使用相机的两种方法。Camera2 — 低级 API,提供对设备的完全控制。CameraX — 高级抽象,自动化典型场景。两者之间的选择取决于项目需求。

特性CameraXCamera2
API 级别高级(use case)低级(完全控制)
设备特定代码不需要每个设备都需要
绑定到 Lifecycle自动手动
扩展内置(HDR、Portrait、Night)需要 OEM 实现
实现复杂度15–30 行代码100–300 行代码
API 支持API 21+API 21+
灵活性标准场景任意场景

对于标准任务使用 CameraX:应用中的相机、二维码扫描仪、ML 流处理。当需要手动曝光控制、完全参数控制的 RAW 拍摄、同时使用多个相机时使用 Camera2。

Kotlin 代码示例

让我们看看 CameraX 在 Android 应用中使用所有三个主要 use case 的完整配置:Preview、ImageCapture 和 ImageAnalysis。

配置 ProcessCameraProvider

代码通过 ProcessCameraProvider 将 CameraX 绑定到 Activity 的 Lifecycle。首先请求 provider 实例,然后创建 use cases 并执行绑定。

kotlin
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 关闭时的资源释放。

用于 ML 处理的 ImageAnalysis

添加 ImageAnalysis use case 用于逐帧处理来自相机的流,例如与 ML Kit 集成。

kotlin
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

CameraX Extensions — 添加高级拍摄模式的模块:人像(背景模糊)、HDR(扩展动态范围)、夜间模式(弱光拍摄)、自动修饰(皮肤校正)和「美颜」(beauty) 模式。扩展仅在相机制造商提供 OEM 实现的设备上激活。

检查和启用扩展

在使用 CameraX Extensions 之前,需要检查当前设备上是否可用该扩展。Google 建议通过 ExtensionsManager.isExtensionAvailable 进行检查。

kotlin
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 管道。

常见问题

CameraX 从什么 Android 版本开始工作?

Android 5.0 (API 21) 及以上版本。CameraX 覆盖 99% 的活跃 Android 设备。对于扩展(Portrait、HDR)需要 API 23+ 和特定模式的 OEM 支持。

CameraX 能否与 ML Kit 一起使用?

可以,ImageAnalysis use case 将每一帧传递给分析器。帧从 YUV_420_888 转换为 InputImage 以用于 ML Kit。这是创建 ML 扫描仪的标准模式。

CameraX 与 Camera2 有什么区别?

CameraX — 高级 API,具有 use case 架构、自动 Lifecycle 绑定和处理设备特定差异。Camera2 — 低级完全控制相机,带有大量样板代码。

CameraX 是否支持视频录制?

支持,VideoCapture use case 在 CameraX 1.1.0-beta 中添加。使用麦克风录制视频并与 Preview 同步。对于更复杂的场景,直接使用 Camera2。

如何在前置和后置摄像头之间切换?

通过 CameraSelector:DEFAULT_BACK_CAMERA 或 DEFAULT_FRONT_CAMERA。要切换,使用新的选择器调用 cameraProvider.bindToLifecycle() — CameraX 会自动重启会话。

总结

  • CameraX — 用于 Android 相机的 Jetpack 库,具有 use case 架构(Preview、ImageCapture、ImageAnalysis、VideoCapture)
  • Use cases 在单个会话中组合:Preview + ImageAnalysis 用于 ML 或 Preview + ImageCapture 用于照片
  • 绑定到 Lifecycle 在屏幕旋转和 Activity 状态更改时自动管理相机资源
  • CameraX Extensions 在兼容设备上添加人像模式、HDR 和夜间拍摄
  • 兼容性 从 API 21 开始覆盖 99% 的 Android 设备,无需设备特定代码
  • 与 ML Kit 集成 通过 ImageAnalysis 允许实时分析每一帧
  • 对于标准任务 CameraX 是最佳选择,对于完全控制请使用 Camera2

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目

另请阅读