一、Android 14/15 Camera 新特性:我眼中的关键变化
做 Camera 系统这么多年,每次大版本更新我都会第一时间刷机看变化。Android 14 和 15 的 Camera 改动,说实话,比前几年实在多了。不是那种「加个 API 就完事」的敷衍,而是真的在解决实际问题。
1.1 Android 14:Ultra HDR 与 更精细的流控制
Android 14 最让我兴奋的,是 Ultra HDR 的正式支持。说白了,就是 JPEG 里嵌入一张 Gain Map,让照片在 HDR 屏幕上能显示更亮的高光、更深的暗部。我去年在 Pixel 8 上测试过,同一张照片,普通模式和 Ultra HDR 模式下的观感差距非常明显。
核心要点:Ultra HDR 不是新的编码格式,而是对现有 JPEG 的扩展。它通过 Gain Map 存储亮度映射信息,兼容性极好——老设备看就是普通 JPEG,新设备能自动识别并显示 HDR 效果。
另一个我比较关注的变化是 CameraManager.setCameraStatusListener。以前要监听摄像头状态变化(比如被别的 App 抢占了),得自己轮询或者用 ContentObserver 绕一圈。现在直接注册回调就行,省心不少。
// Android 14 新增:监听摄像头状态变化
CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
manager.setCameraStatusListener((cameraId, status) -> {
switch (status) {
case CameraManager.CameraStatus.STATUS_AVAILABLE:
Log.d(TAG, "摄像头 " + cameraId + " 可用");
break;
case CameraManager.CameraStatus.STATUS_UNAVAILABLE:
Log.d(TAG, "摄像头 " + cameraId + " 被占用");
break;
}
});
1.2 Android 15:Virtual Camera 与 更底层的控制
Android 15 的 Camera 改动,我个人觉得最有价值的是 Virtual Camera 框架的完善。以前做虚拟摄像头(比如把手机摄像头画面传到 PC 上),得走 V4L2 或者自己写 HAL 层,门槛很高。现在 Google 提供了标准化的 Virtual Camera API,第三方 App 可以像调用物理摄像头一样调用虚拟设备。
嗯,这里要注意:Virtual Camera 目前还处于早期阶段,厂商适配程度参差不齐。我建议你在开发时做好降级方案,别一上来就强依赖这个 API。
| 特性 | Android 14 | Android 15 |
|---|---|---|
| Ultra HDR | 正式支持 | 性能优化 |
| Virtual Camera | 预览版 | 正式 API |
| Camera Status Listener | 新增 | 稳定 |
| 低光预览增强 | 无 | 新增 |
二、UVC Camera 支持:从 Linux 到 Android 的移植
UVC(USB Video Class)摄像头,说白了就是插上就能用的 USB 摄像头。Windows 和 Linux 上早就支持了,但 Android 这边一直是个坑。为什么?因为 Android 的 Camera HAL 设计之初就没考虑过外部 USB 设备。
我记得 2019 年做的一个项目,客户要求在 Android 平板上接 USB 摄像头做扫码。当时我翻遍了 AOSP 代码,发现 UVC 支持全靠 Linux 内核的 V4L2 驱动,但 Android 的 CameraService 根本不认 V4L2 设备。最后只能自己写一个 HAL 层桥接,把 V4L2 的数据流转换成 Android 的 Camera HAL 接口。
2.1 UVC 在 Android 上的实现路径
现在情况好多了。从 Android 14 开始,Google 在 External Camera 框架里正式纳入了 UVC 支持。核心思路是这样的:
- 内核层:Linux 内核自带 UVC 驱动,插上 USB 摄像头后,会生成 /dev/videoX 设备节点。
- HAL 层:Android 提供了一个 External Camera HAL,它直接读取 V4L2 设备,把数据包装成 Camera HAL 要求的格式。
- Framework 层:CameraService 通过 CameraProvider 发现外部摄像头,然后像管理内置摄像头一样管理它。
避坑指南:我曾经在某个厂商的平板上测试 UVC 摄像头,发现预览画面只有 15fps。排查了半天,发现是 External Camera HAL 默认把帧率限制在了 15fps。解决方案是在 HAL 的配置文件中手动设置 max_fps=30。不同厂商的 HAL 实现差异很大,建议你拿到设备后先跑一遍 Camera CTS 测试。
2.2 UVC 摄像头的局限性
别以为 UVC 摄像头在 Android 上就能完美工作。我踩过的坑包括:
- 分辨率限制:很多 UVC 摄像头只支持 640x480 或 1280x720,4K 的很少。
- 帧率不稳定:USB 带宽有限,多个摄像头同时工作时会掉帧。
- 自动对焦:大部分 UVC 摄像头是固定焦距,不支持触控对焦。
- 闪光灯:别想了,USB 摄像头没有闪光灯。
三、External Camera:Android 的官方解决方案
External Camera 是 Google 在 Android 10 开始推的框架,专门解决外接摄像头的问题。到了 Android 14/15,这个框架已经比较成熟了。
3.1 External Camera 的架构
我画了一张图,帮你理解 External Camera 在整个 Camera 系统中的位置:
你看,整个链路其实很清晰。App 层完全不需要关心摄像头是内置的还是外接的,API 调用方式一模一样。区别全在 HAL 层和内核层。
3.2 如何判断摄像头是 External 还是 Internal
开发时经常需要区分内外摄像头。我一般用这个方式:
CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
String[] cameraIds = manager.getCameraIdList();
for (String id : cameraIds) {
CameraCharacteristics chars = manager.getCameraCharacteristics(id);
Integer facing = chars.get(CameraCharacteristics.LENS_FACING);
// 如果是 External 摄像头,facing 会是 LENS_FACING_EXTERNAL
if (facing != null && facing == CameraCharacteristics.LENS_FACING_EXTERNAL) {
Log.d(TAG, "发现外部摄像头: " + id);
}
}
注意:External 摄像头的 LENS_FACING 值是 0(LENS_FACING_FRONT)还是 1(LENS_FACING_BACK)?都不是。它是 3(LENS_FACING_EXTERNAL)。这个值在 Android 10 之后才引入,老设备上可能返回 null。
四、未来趋势:Camera 系统往哪走
聊完了现状,说说我对未来的判断。你想想看,现在的手机摄像头已经卷到一英寸大底、八百万像素了,下一步还能怎么走?
4.1 计算摄影的深化
硬件提升越来越难,但算法还有很大空间。Android 15 已经开始在 Framework 层提供 多帧合成 和 AI 降噪 的接口。我预计未来两年,Google 会把 Pixel 上的 HDR+、夜景模式等算法逐步下沉到 AOSP 里,让所有厂商都能用。
4.2 虚拟摄像头生态
Virtual Camera 的完善,会催生一批新应用。比如:
- 手机摄像头当 PC 摄像头(无线传输)
- 多机位直播(一台手机控制多台手机的摄像头)
- AR/VR 场景下的虚拟摄像头输入
我个人觉得,Virtual Camera 会是 Android 16 的重头戏。Google 正在推动 Camera HAL 3.8 标准,专门优化虚拟摄像头的延迟和功耗。
4.3 UVC 与 External Camera 的融合
现在 UVC 和 External Camera 还是两套独立的实现。未来它们会合并成一套统一的 USB Camera Framework。不管你是插 UVC 摄像头、还是用手机做外接摄像头,底层都走同一个 HAL 实现。这样厂商适配起来也方便。
我的建议:如果你现在要开发外接摄像头相关的产品,优先用 External Camera 框架。它比直接操作 V4L2 更稳定,而且 Google 会持续维护。UVC 支持可以作为备选方案,但别把它当主力。
4.4 安全与隐私的强化
每次 Android 大版本更新,Camera 权限都会收紧。Android 15 已经要求 App 在后台使用摄像头时必须显示 隐私指示器(就是状态栏那个绿点)。未来可能会要求 App 声明具体的使用场景(比如「视频通话」还是「扫码」),否则无法获取摄像头权限。
嗯,这个趋势对开发者来说是个挑战。我建议你现在就开始检查 App 的 Camera 权限使用逻辑,别等到新版本强制要求了再改。
好了,这一章的内容就到这里。Camera 系统的演进速度比我想象中快,尤其是 Android 14/15 这两年,很多以前需要自己折腾的东西,现在都有官方方案了。下一章我们会深入 Camera HAL 层的实现细节,聊聊怎么从底层优化预览延迟。