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
但是对于我的一些用户来说仍然会发生下一个错误(这样的用户现在可能会发生一次或几次,所以不经常发生,但仍然会不时发生):
android.hardware.camera2.CameraAccessException: CAMERA_DISABLED (1): connectHelper:1578: Camera "0" disabled by policy
android.hardware.camera2.CameraAccessException: CAMERA_DISCONNECTED (2): Camera service is currently unavailable
java.lang.IllegalArgumentException: supportsCameraApi:2096: Unknown camera ID 0
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
使用 camera2
打开相机 API:
...
cameraManager.openCamera(cameraId, stateCallback, mainHandler)`
} catch (e: Exception) {
e.printStackTrace()
openReportErrorDialog(e) // so a user could report this issue
...
报告的设备:
- 体内1906
- Wheatek BV5500Plus
- 三星SM-N975F
- 三星 SM-G988W
- 三星 SM-A520F
- 摩托罗拉 REVVLRY
- 华为VOG-L09
- 华为STK-LX1
- 华为MRD-LX1
- 华为无花果-LX1
- 酷派CP3669AS
- Infinix X655C
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_CAMERA
和ACCESS_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' 功能,例如飞行模式适用于收音机。就像上面的企业政策一样,这是您无法控制的 - 用户需要重新启用摄像头访问权限,因此您所能做的就是提出一个对话框,说“摄像头已禁用,抱歉”。
我有一个录制视频的应用程序,它目前有大约 8 万次安装(超过 10 万次下载),Crashlytics 统计数据似乎不错 - Crash-free 用户 99.66% 并且在 Google Play 上的评分也可以 - 4.5
但是对于我的一些用户来说仍然会发生下一个错误(这样的用户现在可能会发生一次或几次,所以不经常发生,但仍然会不时发生):
android.hardware.camera2.CameraAccessException: CAMERA_DISABLED (1): connectHelper:1578: Camera "0" disabled by policy
android.hardware.camera2.CameraAccessException: CAMERA_DISCONNECTED (2): Camera service is currently unavailable
java.lang.IllegalArgumentException: supportsCameraApi:2096: Unknown camera ID 0
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
使用 camera2
打开相机 API:
...
cameraManager.openCamera(cameraId, stateCallback, mainHandler)`
} catch (e: Exception) {
e.printStackTrace()
openReportErrorDialog(e) // so a user could report this issue
...
报告的设备:
- 体内1906
- Wheatek BV5500Plus
- 三星SM-N975F
- 三星 SM-G988W
- 三星 SM-A520F
- 摩托罗拉 REVVLRY
- 华为VOG-L09
- 华为STK-LX1
- 华为MRD-LX1
- 华为无花果-LX1
- 酷派CP3669AS
- Infinix X655C
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_CAMERA
和ACCESS_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' 功能,例如飞行模式适用于收音机。就像上面的企业政策一样,这是您无法控制的 - 用户需要重新启用摄像头访问权限,因此您所能做的就是提出一个对话框,说“摄像头已禁用,抱歉”。