如果为应用授予 START_ACTIVITIES_FROM_BACKGROUND 权限,则从前台服务启动相机(Android 11+)

Posted

技术标签:

【中文标题】如果为应用授予 START_ACTIVITIES_FROM_BACKGROUND 权限,则从前台服务启动相机(Android 11+)【英文标题】:Start camera from foreground service if START_ACTIVITIES_FROM_BACKGROUND granted for the app (Android 11+) 【发布时间】:2022-01-21 12:32:57 【问题描述】:

我的应用进程在收到BOOT_COMPLETED 操作时启动前台服务

该服务用于使用摄像头和麦克风进行视频录制(仪表板摄像头应用)。

要在 android 11+ 上从前台服务启动摄像头,必须满足其中一个条件(免除从前台服务启动摄像头/微机的限制)https://developer.android.com/guide/components/foreground-services#bg-access-restriction-exemptions

我可以使用的唯一例外是:

服务由具有 START_ACTIVITIES_FROM_BACKGROUND 特权权限。

这个不需要用户的任何交互,用户只希望在他开始驾驶汽车时自动开始视频录制,他不希望手动使应用程序可见或从通知开始录制,他不关心这一切,没关系,现在是 2021 年,这些事情可以自动完成,但是感谢 Google 在 2021 年的这些限制,是的,我们应该关心用户私人个人数据的安全,但他们只是可以添加BACKGROUND_CAMERABACKGROUND_RECORD_AUDIO 权限,并像使用ACCESS_BACKGROUND_LOCATION 一样在Google Play 控制台上进行人工审核

如果我理解正确要获得START_ACTIVITIES_FROM_BACKGROUND的许可,我必须满足其中一个条件(免除从后台启动活动的限制)https://developer.android.com/guide/components/activities/background-starts#exceptions

所以我选择了SYSTEM_ALERT_WINDOW 权限,因为如果它是由用户之前授予的,则不需要用户进行任何交互,并且应用程序可以从后台启动活动。这个可以通过Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION) 授予

那么我现在是否授予START_ACTIVITIES_FROM_BACKGROUND 权限?没看懂……

如果是,那么我可以在前台服务中使用从某个后台操作启动的摄像头

但还是

fun isCameraAllowedForPackage(context: Context): Boolean 
    return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) 
        val manager = context.getSystemService(Context.APP_OPS_SERVICE) as AppOpsManager
        val res = manager.unsafeCheckOpNoThrow(
            AppOpsManager.OPSTR_CAMERA,
            Process.myUid(),
            context.packageName
        )
         res == AppOpsManager.MODE_ALLOWED
     else 
        true
    

在我尝试使用相机之前,在前台服务中为我的三星 S10(Android 11)返回 false

为什么?

如果我让应用至少可见一次(启动应用的活动),那么即使手机屏幕关闭,前台服务也可以启动摄像头(此方法返回 true

我还尝试使用 Pixel Emulator (Android 11) 并且对此有不同的行为 - 即使没有 SYSTEM_ALERT_WINDOW 许可,应用程序也可以通过在后台启动的前台服务开始使用相机。所以我不需要https://developer.android.com/guide/components/activities/background-starts#exceptions

我不明白。基本上模拟器不遵循这些规则。

更多关于我的行车记录仪应用程序的问题

最近我收到了来自我的应用用户的报告以及下一条消息

android.hardware.camera2.CameraAccessException: CAMERA_DISABLED (1): validateClientPermissionsLocked:1426:调用者“MY_APP_PACKAGE_NAME” (PID 10300,UID 29860)当传感器隐私时无法打开相机“0” 启用

使用相机时发生错误。 android.hardware.camera2.CameraAccessException: CAMERA_DISABLED (1): connectHelper:2198: 相机“2”被政策禁用

android.hardware.camera2.CameraAccessException: CAMERA_DISABLED (1): validateClientPermissionsLocked:1416: 调用者“MY_APP_PACKAGE_NAME” (PID 10376,UID 25653)无法从后台打开摄像机“0”(调用 UID 10376 proc state 8) 应用程序在尝试打开时捕获此类错误 相机

用户可以从活动/通知/小部件/浮动窗口手动开始录制,也可以根据充电/蓝牙/等事件(在前台服务中注册的广播事件进行录制)自动开始录制

如果isCameraAllowedForPackage()返回false,前台服务不会开始录制,不可能,所以在这种情况下它会返回true,然后应用程序无法打开相机并出现CAMERA_DISABLED错误,我不得到它。

我向用户询问了这个问题,他们回答说,在充电/蓝牙事件自动开始/停止录制时,有时可能会发生(不总是,他们不会为相机设置任何策略)。所以当然他们手机上的应用程序通常可以打开相机,可以使用,有时愚蠢的操作系统会阻止应用程序使用相机,我不明白为什么,没有任何关于这个案例的信息在我之前提到的限制中。因此,对于用户应用程序工作了一段时间没有问题,他们至少打开了一次应用程序的活动(在三星 Android 11+ 上他们必须这样做),所以前台服务 100% 有权使用相机但仍然然后过了一段时间,他们发生了这个错误。

这是一个不同的问题。如果我的应用进程不允许这样做,那么我会收到这样的错误

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

正如我之前提到的,我有一种方法可以在打开相机之前检查是否允许将相机用于我的应用进程

这有很多问题。 (不同制造商的)手机表现不同。 使用相机时出现一些意外异常。

所以基本上即使考虑到一切,例如,用户启动了应用程序的启动活动,该活动启动了前台服务,在这种情况下,现在允许前台使用相机,但打开仍然存在一些问题当同一个前台服务运行一段时间时,相机可能会发生

【问题讨论】:

【参考方案1】:

那么我现在是否获得了 START_ACTIVITIES_FROM_BACKGROUND 权限?

没有。该权限在框架中定义为:

    <permission android:name="android.permission.START_ACTIVITIES_FROM_BACKGROUND"
        android:protectionLevel="signature|privileged|vendorPrivileged|oem|verifier" />

要持有它,您需要在应用的清单中请求它,并且您的应用需要是固件构建的一部分(或由 root 设备的用户安装在特权分区上)。

如果我理解正确要获得 START_ACTIVITIES_FROM_BACKGROUND 许可,我必须满足其中一个条件(免除从后台启动活动的限制)https://developer.android.com/guide/components/activities/background-starts#exceptions

该页面未引用该权限。

【讨论】:

谢谢。我只是认为如果应用程序满足其中一个条件,则认为已授予此权限。所以基本上没有办法从第三方应用程序的前台服务打开相机,该应用程序在没有Android 11+用户交互的情况下启动?您是否也知道为什么我的应用会出现CAMERA_DISABLED 错误? @user924:“所以基本上没有办法从在 Android 11+ 上无需用户交互就启动的前台服务开始使用摄像头?” ——我不知道,对不起。 “你也知道为什么我的应用会出现 CAMERA_DISABLED 错误吗?” - 中间的感觉就像设备策略管理器阻止了相机访问(例如,工作电话),但这只是一个猜测。第一个感觉像是 Android 12 的相机隐私开关,但这也只是猜测。 如果它在手机上被故意阻止,该应用程序对于此类用户根本无法运行,但很少发生,在录制一段时间时,处于空闲状态,以及在接收充电/蓝牙期间同一前台服务中的事件,它无法再次启动相机和视频录制(主要是在设备屏幕关闭时),这是另外的事情

以上是关于如果为应用授予 START_ACTIVITIES_FROM_BACKGROUND 权限,则从前台服务启动相机(Android 11+)的主要内容,如果未能解决你的问题,请参考以下文章

未为角色“my_role_1”授予 ADMIN 选项

授予给定文件夹上的本地应用程序池组的写入权限

旧版Azure AD应用程序注册中的“授予权限”按钮与新体验中的“授予管理员同意”有何不同?

以编程方式为 Android 服务授予权限

在授予通知访问权限后执行 segue

系统方向学习9--android 10.0 去掉未知来源弹窗 默认授予安装未知来源权限