【发布时间】:2015-01-22 00:33:24
【问题描述】:
我见过很多人询问和解释两者之间区别的具体案例,但我不能也似乎不理解一般的区别。两者是同义词吗?一种暗示另一种吗?
【问题讨论】:
我见过很多人询问和解释两者之间区别的具体案例,但我不能也似乎不理解一般的区别。两者是同义词吗?一种暗示另一种吗?
【问题讨论】:
这两个是同义词吗?
没有。 <uses-permission> 说“嘿,Android(和相关的分销渠道),请让用户允许我做 X”。 <uses-feature> 说“嘿,Android(和相关的分销渠道),我有兴趣在具有 Y 功能的硬件上运行”。
<uses-feature> 可能会在硬件不符合您的要求但用户不参与的情况下将您从 Play 商店(和其他渠道)中过滤掉。
一种暗示另一种吗?
有时。 If you request certain permissions, like CAMERA, Android assumes by default that you need the corresponding hardware。如果需要,您可以使用 <uses-feature> 和 android:required="false" 覆盖该默认行为。
【讨论】:
<uses-permission> 元素,因为它可以让维护应用程序的人员清楚地看到您正在请求权限。但是,在 <uses-feature android:name="android.hardware.camera"/> 的特定情况下,AFAIK 您可以跳过 <uses-permission> 元素,Android 会假定您无论如何都想要求它。
建议使用<uses-feature> 和<uses-permission>。您的应用程序的每个功能都需要 <uses-feature> 和属性 android:required="false" 如果您的应用程序可以在没有它的情况下运行。这样做的原因是 Google Play 会过滤掉具有以编程方式实现但不受硬件支持的功能的应用程序,因此您看不到它们。
例如,除了其他几个权限之外,您的应用还拥有<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 权限。如果有设备没有 GPS 功能,则该设备将不会在 Google Play 中看到此应用。如果您的应用在没有 GPS 连接的情况下完全正常运行,那么解决方案是添加:
<uses-feature android:name="android.hardware.location" android:required="false"/>
<uses-feature android:name="android.hardware.location.gps" android:required="false"/>
<uses-feature android:name="android.hardware.location.network" android:required="false"/>
因此,正如@CommonsWare 已经提到的,<uses-feature> 会覆盖<uses-permission> 的默认行为
【讨论】: