AndroidManifest.xml 隐含与显式权限( uses-feature 与 uses-permission )

Posted

技术标签:

【中文标题】AndroidManifest.xml 隐含与显式权限( uses-feature 与 uses-permission )【英文标题】:AndroidManifest.xml implied vs explicit permissions ( uses-feature vs uses-permission ) 【发布时间】:2012-09-20 13:31:55 【问题描述】:

我在我的应用中有一些权限,例如

<uses-permission android:name="android.permission.CONTROL_LOCATION_UPDATES" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />

我怀疑它们实际上没有必要。

根据Android文档,他们都暗示

<uses-feature
    android:name="android.hardware.location"/>

是正确的并且是必需的。

因此,例如,如果我取出其中三个命令中的两个,我所有与 A-GPS 相关的调用仍将完全以相同的方式工作吗?

除了人们重复 android 文档之外,似乎没有太多关于此的文献。

最终,我认为对这么多代码元素暗示 android:required = true 会限制我可以访问的设备数量。

 <uses-feature
    android:name="android.hardware.location" android:required="false"/>

将向更多设备开放应用程序,我可以在应用程序内使用条件逻辑来允许执行某些功能。

但我的主要问题是android.hardware.location 涵盖了很多&lt;uses-permission/&gt; 功能。没有 android.hardware.location.ACCESS_MOCK_LOCATIONandroid.hardware.location.CONTROL_LOCATION_UPDATES ,只有 android.hardware.location

这里有几个假设,但 android 开发人员文档并没有详细说明,只是表明那些单独的 uses-permissions 暗示需要一个 uses-feature。当它不一定是必需的,我只是想确保我的 android sdk 调用有权运行

问题:

1) 如果我取消了其中三个 uses-permissions 中的两个,我所有与 A-GPS 相关的调用是否仍会像我设置了所有这些单独的权限一样以完全相同的方式工作?

2) android.hardware.location 是否更具体?我见过android.hardware.location.NETWORK,但我在哪里可以看到所有的可能性?

【问题讨论】:

【参考方案1】:

因此,例如,如果我取出了其中三个命令中的两个,我所有与 A-GPS 相关的调用仍将以完全相同的方式工作吗?

嗯,这三个权限中的两个应该不是必需的。 ACCESS_MOCK_LOCATION 与 GPS 无关,而是与您自己的模拟位置提供商有关。引用Cyril Mottier:

请大家在发布应用之前从清单中删除 ACCESS_MOCK_LOCATION 权限。忘记会让你成为业余爱好者。

而普通的 SDK 应用程序不能持有CONTROL_LOCATION_UPDATES——这仅适用于使用固件签名密钥签名或安装在固件本身中的应用程序。

因此,一个普通的 SDK 应用程序可以删除这两个用于生产,并可以删除 CONTROL_LOCATION_UPDATES 用于开发。如果您没有在应用程序中使用模拟位置提供程序,您也可以在开发中删除 ACCESS_MOCK_LOCATION。很可能,您一开始就不应该将这两个权限添加到您的应用中。

不过,这一切都与 &lt;uses-feature&gt; 无关。

我可以在应用程序中使用条件逻辑来允许执行某些功能。

当然。您可以在PackageManager 上使用hasSystemFeature() 来查看您是否有android.hardware.location,然后再与LocationManager 打交道。

但我的主要问题是 android.hardware.location 涵盖了很多功能。

动词“cover”在这里对我来说毫无意义,或者在某种程度上,你的方向颠倒了。 &lt;uses-permission&gt; 元素可能暗示 &lt;uses-feature&gt; 元素,但不能反过来。

如果我取消了其中三个使用权限中的两个,我所有与 A-GPS 相关的调用是否仍会像我设置了所有这些单独的权限一样工作?

见上文。

我见过android.hardware.location.NETWORK

你可能见过android.hardware.location.network

我见过android.hardware.location.NETWORK

&lt;uses-feature&gt;的文档中:http://developer.android.com/guide/topics/manifest/uses-feature-element.html

【讨论】:

谢谢,android.permission.ACCESS_LOCATION_EXTRA_COMMANDS @CQM:这是一个正常的权限(即普通的 SDK 应用程序可以持有),虽然我不知道它在 SDK 中控制什么。 感谢您的洞察力,我正在修复其他人编写的应用程序,由于清单过滤,许多设备无法在市场上找到该应用程序,但我没有识别所有他们在我疯狂更改它们之前使用的权限。但我不希望 ACCESS_LOCATION_EXTRA_COMMANDS 允许简单地使 android.hardware.location 成为必需,但我也不知道它控制什么 @CQM:由于我从未见过ACCESS_LOCATION_EXTRA_COMMANDS 被使用过,我将其删除并测试您的应用程序以确认它仍然有效。

以上是关于AndroidManifest.xml 隐含与显式权限( uses-feature 与 uses-permission )的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能将接口与显式运算符一起使用? [复制]

C#'var'关键字与显式定义的变量[重复]

隐式与显式接口实现[重复]

在 C# 中实现接口与显式实现接口 [重复]

JDK并发包温故知新系列—— 显式锁与显式条件

Laravel 急切加载与显式连接