在 Android 开发中,Camera1、Camera2 和 CameraX 是谷歌在不同历史时期推出的三代相机框架。它们的核心区别在于:Camera1 已被淘汰,Camera2 功能最强大但极度复杂,CameraX 是目前官方推荐、开发效率最高的现代化框架。
以下是它们的具体用法、核心区别和选型指南:
核心对比:一分钟看懂区别
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)。
用法流程:
通过
CameraManager获取相机 ID。调用
openCamera()打开相机并监听CameraDevice.StateCallback。创建
CameraCaptureSession(捕捉会话)。构建
CaptureRequest(配置对焦、曝光、白平衡、输出的 Surface 目标)。通过会话发送请求:
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”,只需几行代码就能调用手机厂商的长处。
项目中该如何选择?(选型指南)
绝大多数常规项目 → 毫不犹豫选择 CameraX
如果你的需求是:扫码、人脸识别登录、用户上传头像拍照、普通的短视频录制。
原因:开发速度快,几乎没有兼容性客诉,维护成本极低。
专业级摄影/图形应用 → 必须选择 Camera2
如果你的需求是:美颜相机 App(需要深度定制底层 OpenGL 渲染流)、专业单反级手动相机(手动调 ISO、快门速度、导出 RAW 格式格式)、多摄像头同时联动。
原因:CameraX 为了易用性屏蔽了底层细节,只有 Camera2 能给你百分之百的控制权。