Android 11 锁屏调用相机android.permission.SYSTEM_CAMERA报错

在Android 11中,新增的SYSTEM_CAMERA权限导致第三方应用无法直接调用相机。此权限级别为system|signature,要求应用必须在系统分区签名,同时在privapp-permissions.xml配置白名单。解决方案包括在AndroidManifest添加START_ACTIVITIES_FROM_BACKGROUND权限,但主要解决办法是设备制造商在系统层面进行权限配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

遇到一个问题,在锁屏状态下调用相机调用不起来,查看了一下日志在调用相机的时候报了权限拒报错的语句为android.permission.SYSTEM_CAMERA 权限拿不到,就在应用里面配置了一下这个权限发现问题依旧,找到了部分蛛丝马迹:

解决这个问题的方式 一 :

AndroidManifest下添加 : <uses-permission android:name="android.permission.START_ACTIVITIES_FROM_BACKGROUND" /> 

解决问题的方案二

找到了google官方说明

如下:

在搭载 Android 11 或更高版本的设备上,Android 框架支持系统相机,这些相机设备仅对具有 android.permission.SYSTEM_CAMERA 权限和常规相机权限的进程可见。Android 11 中引入了 android.permission.SYSTEM_CAMERA 权限,其保护级别为 system|signature。这意味着,只有安装在系统分区上且具有与系统相同的证书或使用该证书进行签名的应用才能获得此权限。第三方公开应用无法访问系统相机。

如果设备制造商希望实现需要访问相机的功能,但这些功能仅限于特权应用或系统应用,系统相机会很有用。

由于获得 android.permission.SYSTEM_CAMERA 权限的系统应用还必须具有 android.permission.CAMERA 权限,因此用户可以选择撤消常规的 CAMERA 权限,以防止此类应用访问设备上的相机。

实现

如需将特定相机设备作为系统相机,相机 HAL 必须在其功能列表中公布 ANDROID_REQUEST_AVAILABLE_CAPABILITIES_SYSTEM_CAMERA

如需创建有权访问系统相机的应用,必须在特定于设备的 privapp-permissions.xml 文件中将相应应用列入白名单该文件用于指定必须向哪些应用予 android.permission.SYSTEM_CAMERA 权限。

看到这 理解了为啥 Android10 没有问题Android11 即使配置了 android.permission.SYSTEM_CAMERA也是无用的,必须是拥有系统签名,而且还要再在 privapp-permissions.xml配置白名单之后才能启用。

附上Google管方说明。

### 解决Android应用中CAMERA_OPEN_CLOSE_LISTENER权限失败的方法 对于`CAMERA_OPEN_CLOSE_LISTENER`权限失败的问题,在处理这类问题时,需注意该权限属于特殊权限类别。自Android 6.0 (API level 23)起,Google引入了运行时权限机制,这意味着某些敏感权限不仅要在清单文件中声明,还需要在应用程序运行期间动态请求用户的同意。 针对此特定权限,确保已按照如下方式操作: #### 正确配置权限声明 首先,在`AndroidManifest.xml`文件内正确定义所需权限: ```xml <uses-permission android:name="android.permission.CAMERA"/> <!-- CAMERA_OPEN_CLOSE_LISTENER is a special case, it's not directly declared but associated with camera access --> ``` 值得注意的是,`CAMERA_OPEN_CLOSE_LISTENER`并不是一个可以在manifest中直接声明的标准权限名称;而是当开发者实现了相机打开关闭监听接口(`CameraManager.AvailabilityCallback`)并注册到`CameraManager`之后才会涉及到的一个内部回调事件[^1]。 #### 动态申请摄像头访问权限 由于涉及到了对硬件资源的控制,因此应当遵循最佳实践来实现权限管理逻辑: - 在执行任何依赖于这些权限的操作之前先检查当前状态; - 如果缺少必要的授权,则引导用户完成授予过程; - 处理好拒绝情况下的用户体验设计。 具体代码片段可以参考下面的例子: ```java // Check if we have been granted the Camera permission. int hasPermission = ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA); if (hasPermission != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions( this, new String[]{Manifest.permission.CAMERA}, REQUEST_CODE); } else{ // Proceed with opening or closing listener setup... } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults){ super.onRequestPermissionsResult(requestCode, permissions, grantResults); switch (requestCode){ case REQUEST_CODE:{ if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){ // Permission was granted successfully } else{ // Handle denied scenario here } } } } ``` 此外,考虑到不同设备制造商提供的OpenGL ES驱动程序可能存在不一致的行为以及碎片化现象,建议测试过程中尽可能覆盖多种机型以验证兼容性和稳定性。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值