处理来自服务或模型组件的 Android 6.0 的新权限要求的选项?

Options for dealing with Android 6.0's new permissions requirements from a service or model component?

我正在考虑移植一些现有代码以考虑 Android M 处理权限的新方法。但是,权限 API 需要关联一个 activity(例如 requestPermissions() 方法的第一个参数是 activity)。

那么,如果服务没有 activity,那么需要检查是否已授予权限并请求权限的服务应该如何使用这个新的 API?

服务是否可以创建一个虚拟的不可见 activity 仅供使用权限 API? (如果可能的话,我不喜欢这样做的想法)。

或者假设它不是服务而是需要执行权限检查的模型 class,在 MVC 中,模型不应该有任何 Vs 和 Cs 的知识,但现在它必须在以便知道在 API 权限下使用哪个 Activity。或者可能需要将大量代码从模型代码迁移到 Activity 代码。

关于如何将需要 check/prompt 权限的非 activity 代码迁移到 Android 6.0 有什么想法吗?

更新: 我遗漏了一条重要信息 - 这是预装的代码(我们公司提供设备制造商在 rom 中的代码)并且通常可能是运行 在设备启动时和 运行 在后台。因此,用户在启动应用程序时或之后被提示许可的常见情况(因此此时有 activity)不一定适用。

当用户启用您的服务提供的任何功能时询问它。他们当时会参加您的一项活动。是的,这意味着您的活动需要了解您的服务需要哪些权限。

尽管如此,服务始终可以自行检查 权限,因为 checkSelfPermission() 在所有 Context 实例中都可用。所以你不需要 activity。

我想另一种方法是让您的服务 post 收到一条通知 "feature X requires you to approve more permissions"。实际上,无论如何,这可能是个好主意,以防万一用户进入设置并在事后撤销任何权限。然后,该通知会将用户带到某个 activity 并带有 "enable feature X" button/checkbox - 在选择时请求许可。

So how should a service that needs to check if a permissions has been granted and request for permissions use this new API if the service doesn't have an activity?

几乎总是 activity,除了预装的应用程序和其他应用程序的插件。否则,您的服务不太可能 运行,因为没有任何东西会使用显式 Intent 来启动您应用程序的组件之一,因此它将保持停止状态。

对于已有 activity 的 Android 应用中的 ~99.9%,如果应用的整个操作都需要权限,请先在 运行 上请求权限。正如 Snild Dolkow 所指出的,如果用户后来通过“设置”撤销了权限,您可以在没有 activity 的情况下检测到这一点,然后使用其他 UI 选项(例如,Notification,应用小部件)让用户知道操作已暂停,直到他们再次授予您权限,然后他们将通过您的 activity.

Is it possible for the service to create a dummy invisible activity just for use with the permissions API?

想必您可以 Theme.NoDisplay activity 使用 requestPermissions()。但是,从用户的角度来看,这没有多大意义,除非他们正在与之交互的其他 UI(应用程序小部件?)。突然弹出一个权限对话框不太可能让你受欢迎。

更新 2019-06-15:请注意,Android Q 禁止服务从后台弹出活动。请改用通知。

in MVC a model shouldn't have any knowledge of the Vs and Cs and yet now either it has to in order to know which Activity to use with the permission API

在请求权限之前不要触摸模型,如果权限被撤销则优雅地失败。在其他情况下(磁盘不足 space、没有 Internet 连接等),您已经必须优雅地失败,因此应该以大致相同的方式处理撤销的权限。

using this new 6.0 API seems like an recipe for bad design and tight coupling

欢迎您发表意见。根据我的阅读,Android 工程师认为询问用户权限是用户体验的一部分,因此最好在 UI 层处理。

再说一次:广大 大多数 Android 应用程序不会有这个问题,因为它们有用户界面。没有用户界面 需要 dangerous 权限的应用需要进行一些返工。

this is code that is pre-installed (our company provides code that device manufacture's place in rom) and often may be run at device boot time

首先,请理解这与正常情况相去甚远,由于地球的曲率,您甚至无法从您所在的位置看到 正常情况。 :-) 你真的不能抱怨 Google 没有优化这个特定场景。

据我了解,即使是系统应用程序也应该请求 运行时间权限。例如,Camera 应用程序在 6.0 预览版中做到了。话虽这么说,设备上某处必须有一些数据库来跟踪已授予的内容,并且可能有某种方法可以预先填充它。但是,据推测,用户仍然可以从“设置”中撤销它。但是,制造商可以采取一些特技(例如,搞乱设置应用程序)甚至可能排除这种情况。我会寻找与设备制造商可以做的 "how do I get it so my app cannot be force-stopped?" 相同的领域。

您的替代方案是摆脱 dangerous 权限或将您的应用程序从 SDK 迁移到标准 Linux 二进制文件,该二进制文件将 运行 作为引导过程并被放入可以访问您需要的内容的 Linux 用户组。

您可以发送通知。查看此库以管理权限:permission library