Administrator
发布于 2026-08-06 / 67 阅读
0
0

说下android相机项目,这几个的用法和区分:Camera1/Camera2/CameraX

在 Android 开发中,Camera1、Camera2 和 CameraX 是谷歌在不同历史时期推出的三代相机框架。它们的核心区别在于:Camera1 已被淘汰,Camera2 功能最强大但极度复杂,CameraX 是目前官方推荐、开发效率最高的现代化框架。

以下是它们的具体用法、核心区别和选型指南:

核心对比:一分钟看懂区别

特性

Camera1 (Deprecated)

Camera2 (Native)

CameraX (Jetpack)

推出时间

Android 5.0 之前(已废弃)

Android 5.0 (API 21)

2019年(基于 Jetpack)

架构设计

单一控制流,简单但死板

管道/流式架构(Pipeline)

基于用例(UseCase)

硬件控制力

极低,只能调简单参数

极高,支持帧级手动控制

中等偏上(支持绝大多数核心功能)

设备兼容性

极差(各厂硬件适配碎化)

较差(Legacy/Limited/Full 级别碎化)

极好(官方帮处理了 90% 以上兼容问题)

代码量

极少(几百行)

极多(动辄上千行模板代码)

很少(几十行即可跑通)

生命周期

必须手动在 Activity 生命周期中管理

必须手动管理,极其容易内存泄漏或卡死

自动绑定(Lifecycle-aware)


1. Camera1:已被时代淘汰的过去式

Camera1 是最原始的 API,采用面向对象的方法,通过一个单一的 Camera 类控制所有操作。

  • 用法流程:Camera.open() → setParameters() → setPreviewDisplay() → startPreview() → takePicture()。

  • 致命缺点:

    • 不支持多摄像头同时消费(比如无法同时录像和抓拍高清图)。

    • 厂商兼容性地狱:不同手机厂商对 API 的底层实现不同,导致同一段代码在 A 手机正常,在 B 手机直接黑屏或崩溃。

  • 现状:绝对不要在新项目中使用。 [1]

2. Camera2:追求极致控制力的“怪兽”

为了解决 Camera1 的无能,谷歌在 Android 5.0 推出了 Camera2。它改成了管道(Pipeline)架构,把相机当成一个流水线:输入请求(CaptureRequest) → 硬件处理 → 输出数据(CaptureResult/Surface)。

  • 用法流程:

    1. 通过 CameraManager 获取相机 ID。

    2. 调用 openCamera() 打开相机并监听 CameraDevice.StateCallback。

    3. 创建 CameraCaptureSession(捕捉会话)。

    4. 构建 CaptureRequest(配置对焦、曝光、白平衡、输出的 Surface 目标)。

    5. 通过会话发送请求:session.setRepeatingRequest()(预览)或 session.capture()(拍照)。 [2, 3, 4, 5]

  • 优点:

    • 帧级控制:可以手动调节每一帧的曝光时间、ISO、对焦距离。

    • 多路输出:可以同时将画面输出给预览界面、录像组件和图像分析器(用于 AI 识别人脸等)。

  • 缺点:太复杂。即便是简单的开启预览,也需要编写大量复杂的异步回调代码,极其容易出现状态管理错误。

3. CameraX:现代开发的黄金标准

CameraX 是基于 Camera2 封装的 Jetpack 库。它核心的思想是“基于用例(UseCase)”。你不需要管底层的流水线,只需要告诉它你想干什么。 [6]

  • 三大核心用例:

    • Preview:想看画面。

    • ImageCapture:想拍照片。

    • VideoCapture:想录视频。

    • ImageAnalysis:想拿原始数据做点 CPU/GPU 算力分析(如扫码、AR)。

  • 用法流程:

    // 1. 创建预览用例
    val preview = Preview.Builder().build().also {
        it.setSurfaceProvider(viewFinder.surfaceProvider)
    }
    // 2. 创建拍照用例
    val imageCapture = ImageCapture.Builder().build()
    // 3. 绑定到生命周期(无需手动在 onPause/onResume 里 release 相机)
    val cameraProvider = ProcessCameraProvider.getInstance(context).get()
    cameraProvider.bindToLifecycle(this as LifecycleOwner, CameraSelector.DEFAULT_BACK_CAMERA, preview, imageCapture)
    
  • 优点:

    • 生命周期感知:绑定 Activity/Fragment 后,组件销毁时相机自动释放,彻底告别内存泄漏。

    • 自动兼容:谷歌建了一个庞大的测试实验室,把各大厂商(三星、华为、小米等)的各类奇葩不兼容 Bug 在 CameraX 内部逻辑里抹平了。

    • 扩展延迟(Extensions):原生支持手机自带的“夜景模式”、“人像虚化”、“HDR”,只需几行代码就能调用手机厂商的长处。


项目中该如何选择?(选型指南)

  1. 绝大多数常规项目 → 毫不犹豫选择 CameraX

    • 如果你的需求是:扫码、人脸识别登录、用户上传头像拍照、普通的短视频录制。

    • 原因:开发速度快,几乎没有兼容性客诉,维护成本极低。

  2. 专业级摄影/图形应用 → 必须选择 Camera2

    • 如果你的需求是:美颜相机 App(需要深度定制底层 OpenGL 渲染流)、专业单反级手动相机(手动调 ISO、快门速度、导出 RAW 格式格式)、多摄像头同时联动。

    • 原因:CameraX 为了易用性屏蔽了底层细节,只有 Camera2 能给你百分之百的控制权。


评论