首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在某些设备上不时出现Camera2 cameraManager.openCamera异常

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

Stack Overflow用户
提问于 2021-04-27 14:14:57
回答 2查看 3.8K关注 0票数 2

我有一个记录视频的应用程序,它有大约80K的当前安装(超过100 K的下载),Crashlytics的统计数据似乎是良好的无崩溃用户99.66%,在Google Play上的评分也是OK - 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打开相机时:

代码语言:javascript
复制
...
    cameraManager.openCamera(cameraId, stateCallback, mainHandler)`
} catch (e: Exception) {
    e.printStackTrace()
    openReportErrorDialog(e) // so a user could report this issue
...

报告的装置:

  • Vivo 1906
  • Wheatek
  • X655C

Android版本:从8到11 (app min SDK是6)

因此,它基本上可以对特定用户正常工作一段时间,在打开相机时没有问题,但这种异常有时会发生在这样的用户身上。

我不知道为什么会这样。我不能在我自己的设备上复制这个问题(两个三星,一个联想,一个华为和一个小米设备),只有用户可以不时报告这样的问题。

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

更新

找到这个

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

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

因此,基本上,在重新启动设备后,如果没有用户交互,我们就无法自动启动相机。

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-04-28 23:02:54

代码语言:javascript
复制
android.hardware.camera2.CameraAccessException: CAMERA_DISABLED (1): connectHelper:1578: Camera "0" disabled by policy

这要么意味着该设备安装了一个企业策略,例如禁用相机(雇主不希望员工在工作中拍照),要么你的应用程序试图在最新发布的Android系统上打开摄像头。

如果是策略,除了告诉用户已经有了策略并向管理员抱怨之外,没有什么可以做的。

代码语言:javascript
复制
android.hardware.camera2.CameraAccessException: CAMERA_DISCONNECTED (2): Camera service is currently unavailable

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

这些通常意味着一些东西在相机堆栈中崩溃--直到事情重新启动(通常需要几秒钟),所有的相机都会被报告为未知。理想情况下,这种情况永远不会发生,但不幸的是,即使在最好的设备上也存在bug。几秒钟后重试可能会有效,除非手机上的摄像头硬件在某种程度上失败,导致持续的崩溃。

代码语言:javascript
复制
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有某种“关闭所有相机”的功能,就像飞机模式是用于无线电的。就像上面的企业策略一样,这是你无法控制的东西--用户需要重新启用相机访问,所以你所能做的就是设置一个对话框,上面写着“相机被禁用了,对不起”。

票数 3
EN

Stack Overflow用户

发布于 2022-07-04 12:35:19

如果您的应用程序以Android 10 (API级别29)或更高为目标,并且访问前台服务中的位置信息,则将location前台服务类型声明为组件的属性。

代码语言:javascript
复制
<manifest>
...
<service ... android:foregroundServiceType="location|camera" />

在运行时,如果前台服务只需要访问清单中声明的类型的子集,则可以使用以下代码段中的逻辑限制服务的访问:

代码语言:javascript
复制
Notification notification = ...;
Service.startForeground(notification, FOREGROUND_SERVICE_TYPE_LOCATION| FOREGROUND_SERVICE_TYPE_CAMERA);

这就是你如何能够在背景中使用相机。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67284842

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档