以编程方式为 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 服务授予权限的主要内容,如果未能解决你的问题,请参考以下文章