如何要求多个权限启动或绑定到服务

时间:2013-12-12 18:28:56

标签: android permissions

根据docs,Android清单文件可以使用Service的以下语法:

<service android:enabled=["true" | "false"]
         android:exported=["true" | "false"]
         android:icon="drawable resource"
         android:isolatedProcess=["true" | "false"]
         android:label="string resource"
         android:name="string"
         android:permission="string"
         android:process="string" >
    . . .
</service>

权限属性特别指定:

  

实体必须拥有的权限的名称   启动服务或绑定它。

但似乎我不能请求实体启动我的服务的多个权限。那是真的吗?无论如何都要绕过这个?

在Stackoverflow上,我发现的最接近的是this answer作者说:

  

Android服务可以拥有多个权限,但权限是   在应用程序级别授予,而不是在服务级别授予。

然后他继续解释<uses-permission>属性,这不是我想要的。 Another answer进一步降低了我的希望。这似乎确实不可能。

如果是这种情况,我正在考虑的替代方案是为我需要的每个权限提供一项服务,并使它们全部作为负责执行工作的实际服务的转发器。还有更好的主意吗?

1 个答案:

答案 0 :(得分:3)

  

真的是这样吗?

在清单中的自动保护方面,是的。这是99.9%的情况。

  

无论如何都要绕过这个?

使用like checkCallingPermission()的内容检查Java代码中的其他权限。

  

然后他接着解释了我不想要的属性。

正确。

  

我正在考虑的替代方案是为我需要的每个权限提供一项服务,并使它们全部作为负责执行工作的实际服务的转发器。

只有在尝试对权限进行逻辑OR时才有意义,调用者必须拥有权限X 权限Y.直到问题中的这一点,我有假设你想要权限上的逻辑AND(调用者必须持有权限X 权限Y)。

我无法想象一个场景,其中传入权限的逻辑OR将是有用的,更不用说必要了。话虽这么说,如果您使用命令模式startService(),不导出“真实”服务,并且在从导出的服务转发命令后调用stopSelf(),则解决方法应该有效。如果你的愿景是使用这种代理方法和绑定模式,使用bindService(),可能会$DEITY怜悯你的灵魂,因为你需要它。