Camera2 cameraManager.openCamera 在某些设备上时常出现异常

Camera2 cameraManager.openCamera exception from time to time on some devices

我有一个录制视频的应用程序,它目前有大约 8 万次安装(超过 10 万次下载),Crashlytics 统计数据似乎不错 - Crash-free 用户 99.66% 并且在 Google Play 上的评分也可以 - 4.5

但是对于我的一些用户来说仍然会发生下一个错误(这样的用户现在可能会发生一次或几次,所以不经常发生,但仍然会不时发生):

使用 camera2 打开相机 API:

...
    cameraManager.openCamera(cameraId, stateCallback, mainHandler)`
} catch (e: Exception) {
    e.printStackTrace()
    openReportErrorDialog(e) // so a user could report this issue
...

报告的设备:

Android 版本:从 8 到 11(应用最小 SDK 为 6)

所以基本上它可以在一段时间内为特定用户正常工作,打开相机时没有问题,但有时会为此类用户发生此异常

我不知道为什么会这样。我无法在我自己的设备(两台三星,一台联想,一台华为和一台小米设备)上重现此问题,只有用户可以不时报告此类问题...

这里最废话的例外是Unknown camera ID 0,因为在打开相机之前我得到了可用相机的列表,所以它不是硬编码的,这样的相机id不可能不存在,并且用户说在此错误之前相机工作正常

更新

找到这个

https://developer.android.com/guide/components/foreground-services#bg-access-restrictions

因此,如果前台服务是由系统启动的(在 BOOT_COMPLETED 广播中,在清单中声明)而不是由应用启动(如果用户启动应用),则它无法访问摄像头和麦克风。

所以基本上在重启设备后,我们无法在没有用户交互的情况下自动启动相机。

对于汽车司机的仪表板摄像头应用来说真的很糟糕...

他们添加了ACCESS_BACKGROUND_LOCATION,但是没有ACCESS_BACKGROUND_CAMERAACCESS_BACKGROUND_RECORD_AUDIO...

android.hardware.camera2.CameraAccessException: CAMERA_DISABLED (1): connectHelper:1578: Camera "0" disabled by policy

这要么意味着设备安装了禁用相机的企业政策(雇主不希望员工在工作中拍摄东西),要么您的应用试图在后台打开相机,最近Android 发布。

如果这是政策,除了告诉用户有政策并向他们的管理员投诉外,您无能为力。

android.hardware.camera2.CameraAccessException: CAMERA_DISCONNECTED (2): Camera service is currently unavailable

java.lang.IllegalArgumentException: supportsCameraApi:2096: Unknown camera ID 0

这些通常意味着相机堆栈中的某些东西已经崩溃 - 在事情重新启动之前(通常需要几秒钟),所有相机都将被报告为未知。 理想情况下这永远不会发生,但不幸的是即使在最好的设备上也存在错误。几秒钟后重试可能会成功,除非 phone 上的相机硬件以某种方式出现故障导致持续崩溃。

android.hardware.camera2.CameraAccessException: CAMERA_DISABLED (1): validateClientPermissionsLocked:1066: Caller "com.MY_APP_PACKAGE" (PID 10237, UID 21433) cannot open camera "1" when sensor privacy is enabled

这意味着 OEM 具有某种 'shut off all cameras' 功能,例如飞行模式适用于收音机。就像上面的企业政策一样,这是您无法控制的 - 用户需要重新启用摄像头访问权限,因此您所能做的就是提出一个对话框,说“摄像头已禁用,抱歉”。