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

Posted

技术标签:

【中文标题】以编程方式为 Android 服务授予权限【英文标题】:Grant permissions programatically for an Android service 【发布时间】:2018-01-18 09:42:33 【问题描述】:

我正在构建一个应该在没有任何屏幕的硬件上运行的应用程序。要运行应用程序,我需要两个权限:相机和写入存储。由于我的应用程序没有任何用户界面,并且设备没有任何显示用户界面的方式,我想知道如何为应用程序授予权限。

在这个特定的应用程序中,用户已经知道当用户按下按钮时设备将拍摄图像。因此,从用户的角度来看,无需明确授予权限。

提前致谢。

【问题讨论】:

普通安卓是没有办法的。仅适用于 android 设备。 查看how-to-request-permissions-from-a-service-in-android-marshmallow 【参考方案1】:

无法在运行时添加权限,它们必须在 AndroidManifest 中明确显示,因为它们需要在安装时呈现给 Android 用户。

我建议你看看下面的帖子:Permission issue while starting a service from android

当一个服务在它的 清单的标签。通过这样做,其他应用程序将需要声明一个 他们自己的清单中的相应元素能够启动,停止, 或绑定到服务。

从 GINGERBREAD 开始,使用 Context.startService(Intent) 时,您可以 还设置 Intent.FLAG_GRANT_READ_URI_PERMISSION 和/或 Intent.FLAG_GRANT_WRITE_URI_PERMISSION 在 Intent 上。这将授予 Service 临时访问 Intent 中的特定 URI。 访问将一直保持,直到服务为此调用 stopSelf(int) 启动命令或以后的命令,或直到服务完全 停了下来。这适用于授予对具有 未请求保护服务的许可,甚至当 服务根本没有导出。

此外,服务可以通过以下方式保护对它的单个 IPC 调用 权限,通过调用 checkCallingPermission(String) 方法 在执行该调用之前。

有关更多信息,请参阅安全和权限文档 权限和安全性。

【讨论】:

【参考方案2】:

在没有 UI(没有任何 xml 布局)的情况下制作一个透明的活动,并为 android marshmallow 权限编写代码。当您的应用程序运行时,然后从服务调用此活动,用户将仅在应用程序从硬件或任何地方从任何地方触发时看到权限。当应用程序打开时,透明活动是打开的,用户可以授予权限。

【讨论】:

但问题是设备上没有屏幕。所以用户无法看到权限。 您的应用程序只有服务权限...从该服务调用透明活动启动您的应用程序。表示当应用程序触发某事(启动服务)时。简单:第 1 步您可以在没有 UI 和代码的情况下创建一个透明的活动,以获得您想要的权限。步骤 2. 从服务中调用此 Activity 得到它(您可以从服务中启动 Activity,无需任何 UI 屏幕)。当应用程序嵌入设备时,当这个活动调用只有权限弹出窗口时。

以上是关于以编程方式为 Android 服务授予权限的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式授予本地用户权限以使用 .Net 启动服务

Android M:以编程方式撤销权限

Android M:以编程方式撤销权限

以编程方式向用户授予特定表权限的最佳方法?

以编程方式列出已授予访问权限的 Bigquery 数据集,而无需事先知道项目 ID

已授予账号 "以服务方式登录"的权限