AndroidManifest.xml中的隐式权限与显式权限(uses-feature vs uses-permission)

8

我在我的应用程序中拥有一些权限,比如

<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:required = true对代码的许多元素具有限制性,限制了我可以访问的设备数量。

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

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

但是我主要的问题是,android.hardware.location 覆盖了如此多的 <uses-permission/> 功能。没有 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个回答

5
那么,例如,如果我去掉了这三个命令中的两个,我的所有A-GPS相关调用将仍然以完全相同的方式工作吗?
好吧,这三个权限中的两个不应该是必需的。ACCESS_MOCK_LOCATION与GPS无关,而是与您自己的模拟位置提供程序有关。引用Cyril Mottier的话:
请大家在发布应用程序之前从清单中删除ACCESS_MOCK_LOCATION权限。忘记这一点会让你成为业余人士。
普通SDK应用程序无法保留CONTROL_LOCATION_UPDATES - 这仅适用于使用固件签名密钥或安装在固件本身中的应用程序。
因此,普通SDK应用程序可以在生产环境中删除这两个,并且可以在开发过程中删除CONTROL_LOCATION_UPDATES。如果您的应用程序中没有使用模拟位置提供程序,则在开发过程中也可以删除ACCESS_MOCK_LOCATION。最可能的情况是,您根本不应该在应用程序中添加这两个权限。
这与<uses-feature>无关。
可以在应用程序中使用条件逻辑来允许某些功能执行。
确实。您可以在PackageManager上使用hasSystemFeature(),以查看是否具有android.hardware.location,然后再处理LocationManager
但我的主要问题是,android.hardware.location涵盖了如此多的功能。
动词“覆盖”在这里对我来说没有意义,或者在某种程度上,你把方向颠倒了。 <uses-permission>元素可能暗示<uses-feature>元素,但不反过来。
如果我去掉三个权限中的两个,所有与A-GPS相关的调用是否仍将与设置了所有单独权限时完全相同?
见上文。
我已经看到了android.hardware.location.NETWORK。
您可能已经看到android.hardware.location.network

我已经看到了android.hardware.location.NETWORK

<uses-feature>的文档中:http://developer.android.com/guide/topics/manifest/uses-feature-element.html


谢谢,android.permission.ACCESS_LOCATION_EXTRA_COMMANDS是什么意思? - CQM
@CQM:这是一种普通权限(即常规SDK应用程序可以持有它),但我不知道它在SDK中控制什么。 - CommonsWare
感谢您的见解,我正在修复其他人编写的应用程序,由于清单过滤,许多设备无法在市场上找到该应用程序,但在我疯狂更改它们之前,我没有意识到他们使用了所有权限。 但是,我不希望“ACCESS_LOCATION_EXTRA_COMMANDS”权限仅使“android.hardware.location”成为必需,但我也不知道它控制什么。 - CQM
@CQM:由于我从未见过使用ACCESS_LOCATION_EXTRA_COMMANDS,我建议将其删除并测试您的应用程序,以确认它仍然可以正常工作。 - CommonsWare

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接