首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在某些设备上不时出现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

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
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67284842

复制
相关文章

相似问题

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