Android 11后台启动相机预览遇Camera_DISABLED策略错误求助
Android 11相机访问权限异常问题
问题现象
- Android 10环境下运行正常,Android 11中触发相机访问故障
- 全新安装并授权权限后初期可正常运行,一段时间后出现错误,相机预览无法显示
- 错误日志:
android.hardware.camera2.CameraAccessException: CAMERA_DISABLED (1): connectHelper:1747: Camera "0" disabled by policy at android.hardware.camera2.CameraManager.throwAsPublicException(CameraManager.java:1022) at android.hardware.camera2.CameraManager.openCameraDeviceUserAsync(CameraManager.java:550)
当前实现场景
通过广播接收器通知Service,由Service负责展示相机预览,应用清单内容如下:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="com.app.software"> <queries> <package android:name="com.app.myservice" /> </queries> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-feature android:name="android.hardware.camera2.full" /> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.START_ACTIVITIES_FROM_BACKGROUND" tools:ignore="ProtectedPermissions" /> <application android:name=".Application" android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.MyApp"> <receiver android:name=".service.BootCompletedReceiver" android:enabled="true" android:exported="false"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> <action android:name="android.intent.action.QUICKBOOT_POWERON" /> </intent-filter> </receiver> <receiver android:name=".service.MyAppNotificationReceiver"> <intent-filter> <action android:name="com.app.software.CAM_PREVIEW" /> </intent-filter> </receiver> <service android:name=".service.MyService" android:enabled="true" android:exported="true" android:foregroundServiceType="camera" /> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
已排查内容
- 确认设备无工作策略限制
- 已在清单中声明
START_ACTIVITIES_FROM_BACKGROUND权限,但问题未解决
问题解答
1. START_ACTIVITIES_FROM_BACKGROUND权限的使用条件
- 这是系统级保护权限,普通第三方应用无法通过清单声明直接获取,
tools:ignore="ProtectedPermissions"仅能让编译通过,实际运行时系统不会授予该权限 - 只有系统应用、具备特殊签名的应用,或处于企业管理设备且被允许的场景下,才能获得该权限
- Android 11+强制限制第三方应用在后台启动Activity,即使声明该权限也无法绕过此规则,目的是避免后台应用打扰用户
2. 无需切换到前台的相机预览替代方案
Android 11及以上对后台相机访问有严格管控,可行方案如下:
(1)规范使用前台服务
- 你的Service已声明
android:foregroundServiceType="camera",但必须在启动服务立即调用startForeground()展示明确的相机运行通知,不能延迟 - 通知需清晰告知用户相机正在运行,这是Android 11+对相机前台服务的强制要求,否则系统会判定为后台违规访问并禁用相机
- 示例代码(在Service的
onStartCommand中):
// 创建相机运行状态的通知 Notification notification = new NotificationCompat.Builder(this, CAMERA_CHANNEL_ID) .setContentTitle("相机正在运行") .setSmallIcon(R.drawable.ic_camera) .setPriority(NotificationCompat.PRIORITY_LOW) .build(); // 启动前台服务 startForeground(CAMERA_NOTIFICATION_ID, notification); // 之后再初始化相机资源
(2)使用画中画(PiP)模式
- 将相机预览Activity切换到画中画模式,应用无需完全占据前台,仍可保持相机访问权限
- 画中画模式是系统允许的合规场景,不会触发相机禁用策略,同时用户可并行操作其他应用
(3)检查相机资源释放逻辑
CAMERA_DISABLED错误也可能源于相机资源未正确释放,导致系统判定资源滥用- 确保在Service销毁、相机暂停时,调用
cameraDevice.close()、cameraCaptureSession.close()等方法彻底释放资源,避免泄漏
额外注意事项
- Android 11+中,即使是前台服务,若用户长时间未与应用交互,系统也可能自动回收相机权限
- 禁止在广播接收器中直接初始化相机,广播接收器生命周期极短,应将相机逻辑放在前台服务中处理
内容的提问来源于stack exchange,提问作者mobile_dude
相关产品推荐
相关产品推荐

