【问题标题】:Camera2 cameraManager.openCamera exception from time to time on some devicesCamera2 cameraManager.openCamera 在某些设备上时不时出现异常
【发布时间】:2021-04-27 14:14:57
【问题描述】:

我有一个录制视频的应用程序,当前安装量约为 8 万次(下载量超过 10 万次),Crashlytics 的统计数据似乎不错 - 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
...

报告的设备:

  • vivo 1906
  • Wheatek BV5500Plus
  • 三星 SM-N975F
  • 三星 SM-G988W
  • 三星 SM-A520F
  • 摩托罗拉 REVVLRY
  • 华为VOG-L09
  • 华为STK-LX1
  • 华为MRD-LX1
  • 华为FIG-LX1
  • 酷派CP3669AS
  • 英飞凌 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_CAMERAACCESS_BACKGROUND_RECORD_AUDIO...

【问题讨论】:

    标签: android android-camera android-camera2


    【解决方案1】:
    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
    

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

    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 具有某种“关闭所有摄像头”功能,例如用于无线电的飞行模式。与上面的企业政策一样,这是您无法控制的事情 - 用户需要重新启用摄像头访问权限,因此您所能做的就是显示“摄像头已禁用,抱歉”的对话框。

    【讨论】:

    • 或者您的应用正在尝试在后台打开相机,在较新的 Android 版本上。_ 是的,我的应用(行车记录仪)可以继续或开始在后台录制(粘性前台服务),但这通常适用于大多数设备,即使在最新版本上也是如此。那么有些设备可以防止在后台使用摄像头吗?
    • 所以出现一些错误我可以尝试重新打开相机。但是哪种方法更好:1)几秒钟后再次尝试cameraManager.openCamera() 或2)cameraManager.registerAvailabilityCallback()?或者最后一个通常仅在其他一些应用程序发布特定相机(停止使用它)并且对于提到的错误没有用处时触发?
    • Android 上的“后台”表示后台服务或不再可见的应用。带有通知的前台服务仍然可以正常使用相机。对于“未知相机 ID”的情况,等待可用性回调应该可以正常工作。但重试几次可能更简单,间隔 500 毫秒或类似的时间。
    • 很奇怪。我总是通过通知启动前台服务,例如在 USB 充电开始时自动启动视频录制,但在一些设备上仍然会出现 CAMERA_DISABLED ... cannot open camera "0" from background 这样的错误
    • 如果您可以创建一个可以重现该问题的示例应用程序,您可以向 Android 提交有关此问题的错误;应该可靠地工作:issuetracker.google.com/issues/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-03
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    • 2015-01-09
    相关资源
    最近更新 更多