Android 12调用getCameraCharacteristics报未知相机0异常如何解决
问题触发原因
- 该异常是Android 12系统相机管控逻辑变更叠加部分厂商ROM实现bug导致的,和应用本身的相机枚举逻辑无关。
- Android 12新增了相机使用的前台可见性强制校验规则:当系统判定应用处于非用户可感知的后台状态时,会直接从HAL层断开相机设备节点映射,哪怕应用此前已经通过
getCameraIdList()拿到了包含ID 0在内的完整相机列表,只要底层节点被回收,后续调用getCameraCharacteristics()、openCamera()等接口时就会抛出No such file or directory (-2)的异常。 - 仅在Android 12出现偶发的原因:Android 12之前的版本不会主动回收已枚举的相机设备节点,而部分定制ROM厂商在落地Android 12的相机隐私规则时存在状态同步bug,哪怕应用通过带
camera类型的前台服务持有合法相机权限,依然可能被系统误判为后台应用,强制断开相机连接;甚至在应用刚切回前台、相机节点还未完成重新挂载的短时间窗口内,也会触发该异常。 - 日志中已经枚举到ID 0为选中相机、但调用时提示设备不存在,就是典型的「枚举相机列表和实际调用接口的时间差内,系统回收了对应相机节点」的场景。
可行修复方案
- 取消相机ID列表缓存逻辑:所有涉及相机的操作(包括查询参数、打开相机)执行前,必须实时调用
getCameraIdList()校验目标相机ID是否存在,不要直接使用之前缓存的ID列表发起调用。 - 注册相机可用状态监听:通过
CameraManager.registerAvailabilityCallback()注册监听,只有收到目标相机ID对应的onCameraAvailable回调后,再执行后续相机操作;应用从后台切回前台、或者前台服务启动后不要立刻操作相机,预留200-300ms的缓冲时间等待系统完成相机节点挂载。 - 补全异常兜底逻辑:捕获
getCameraCharacteristics()和openCamera()抛出的IllegalArgumentException,当异常信息匹配未知设备的报错特征时,不要直接触发应用崩溃,执行2-3次间隔300ms的重试,重试前重新校验相机ID是否存在,多次重试失败再提示用户检查相机占用情况、重启应用。 - 适配Android 12前台服务要求:如果应用需要在后台场景使用相机,必须将对应前台服务的
foregroundServiceType声明为camera,不要使用普通前台服务持有相机资源,避免被系统判定为违规后台调用相机主动断开连接。
触发时的典型报错日志:
java.lang.IllegalArgumentException: getCameraCharacteristics:1019: Unable to retrieve camera characteristics for unknown device 0: No such file or directory (-2) at android.hardware.camera2.CameraManager.throwAsPublicException(CameraManager.java:1591) at android.hardware.camera2.CameraManager.getCameraCharacteristics(CameraManager.java:693)故障设备的相机枚举日志通常显示相机列表正常,例:
Camera ID: 0 (selected), all [0, 2, 1, 3] Cameras level: FULL, LIMITED, LIMITED, LIMITED
内容的提问来源于stack exchange,提问作者user924
相关产品推荐
相关产品推荐

