Android后台进程中如何限制或检测活跃摄像头设备?
Android摄像头活跃状态检测方案调研与问题
我们的产品有一项安全需求:使用我方库时,摄像头不能处于活跃状态。调研的所有可行方案都缺乏统一性,且无法覆盖所有潜在边缘场景——因为最新Android API级别增强了用户隐私保护,例如Android文档中提到ActivityManager.getRunningTasks(int maxInt)和ActivityManager.getRunningAppProcesses()已被弃用且受限,而原本它们可能是可行方案。
潜在检测方法调研
1. android.hardware.camera2.CameraManager
- 通常,优先级更高(最顶层的前台)进程在访问摄像头时拥有最高优先级
- 同时打开多个摄像头会产生未定义行为,具体取决于设备实现或API级别:若摄像头已被占用,会抛出
CameraAccessException(但仍取决于配置),已打开的一个或多个CameraDevice会断开连接 - 可使用
AvailabilityCallback检测摄像头是否不可用(即被其他进程启用),但无法处理我方库启动前摄像头已处于活跃状态的情况
2. Device administration(设备管理)
- 适用于企业应用,而我们的产品并非此类应用
- 其
disable-camera策略已开始被弃用
3. UsageStatsManager(可能是最具前景的方案)
UsageStatsManager.queryEvents日志示例:
1: W UsageStatsManager TEST :: UsageStats event: me.jagar.xscamera2 8 seconds ago 2: W UsageStatsManager TEST :: UsageStats event: me.jagar.xscamera2 8 seconds ago 3: W UsageStatsManager TEST :: UsageStats event: com.google.android.apps.nexuslauncher 8 seconds ago 4: W UsageStatsManager TEST :: UsageStats event: android 8 seconds ago 5: W UsageStatsManager TEST :: UsageStats event: me.jagar.xscamera2 7 seconds ago 6: W UsageStatsManager TEST :: UsageStats event: com.google.android.apps.nexuslauncher 1 seconds ago
第4行是me.jagar.xscamera2激活Android硬件(摄像头)服务的记录,但问题在于:仅依赖android包名无法确定是摄像头服务。
事件类型日志示例:
1: W UsageStatsManager TEST :: UsageStats event PKG NAME: me.jagar.xscamera2 :: 29 seconds ago :: TYPE: 19 -- HERE I STARTED THE RECORDING 2: W UsageStatsManager TEST :: UsageStats event PKG NAME: me.jagar.xscamera2 :: 29 seconds ago :: TYPE: 2 3: W UsageStatsManager TEST :: UsageStats event PKG NAME: com.google.android.apps.nexuslauncher :: 29 seconds ago :: TYPE: 1 4: W UsageStatsManager TEST :: UsageStats event PKG NAME: android :: 29 seconds ago :: TYPE: 12 5: W UsageStatsManager TEST :: UsageStats event PKG NAME: me.jagar.xscamera2 :: 29 seconds ago :: TYPE: 23 6: W UsageStatsManager TEST :: UsageStats event PKG NAME: com.google.android.apps.nexuslauncher :: 22 seconds ago :: TYPE: 2 7: W UsageStatsManager TEST :: UsageStats event PKG NAME: com.google.android.apps.nexuslauncher :: 21 seconds ago :: TYPE: 23 8: W UsageStatsManager TEST :: UsageStats event PKG NAME: me.jagar.xscamera2 :: 19 seconds ago :: TYPE: 12 9: W UsageStatsManager TEST :: UsageStats event PKG NAME: me.jagar.xscamera2 :: 11 seconds ago :: TYPE: 1 10: W UsageStatsManager TEST :: UsageStats event PKG NAME: me.jagar.xscamera2 :: 8 seconds ago :: TYPE: 20 -- HERE I STOPPED THE RECORDING
对应的事件常量定义:
UsageEvents.NOTIFICATION_INTERRUPTION = 12 UsageEvents.FOREGROUND_SERVICE_START = 19 UsageEvents.FOREGROUND_SERVICE_STOP = 20
me.jagar.xscamera2是一个测试应用,它启动前台服务进行预览,并在后台使用摄像头设备录制。
存在的问题:
- 没有事件能直接表明摄像头设备的状态
- 若尝试通过限制可能抢占摄像头的前台服务来间接检测,无法确保捕获足够长的事件列表——比如无法检测一周前甚至一年前启动但从未停止的前台服务
疑问与寻求方案
还有其他思路或解决方案吗?我遗漏了什么?
内容的提问来源于stack exchange,提问作者Vladimir Computin
相关产品推荐
相关产品推荐

