Google正在通过电子邮件通知Android位置权限的更改:
我们将于2016年10月15日进行更改,这将影响应用 目标API版本21(Android 5.0,Lollipop)或更高版本使用 ACCESS_FINE_LOCATION但没有明确拥有 “android.hardware.location.gps”使用功能。向前看,这些 应用程序可以安装在没有GPS的设备上 硬件。在大多数情况下,这不会成为Wi-Fi和Cell-ID以来的问题 基于位置为典型操作提供足够高的保真度 这些应用程序。但是,任何需要GPS硬件的应用程序,例如 GPS导航仪,应该明确添加 “android.hardware.location.gps”对其清单使用了特性。
如果您的应用需要GPS正常运行且您不包含 在您的舱单声明中,您的用户的应用可能不佳 经验。
此外,如果您正在使用融合位置提供商并希望收到 来自GPS的最准确的位置样本(即带有 PRIORITY_HIGH_ACCURACY),你必须包括 应用程序清单中的“android.hardware.location.gps”功能 确保Google Play仅将您的应用分发到使用GPS的设备 传感器
中详细了解此更改
来自Android Developers Help Center
要从NETWORK_PROVIDER或GPS_PROVIDER接收位置更新,您必须通过在Android清单文件中分别声明ACCESS_COARSE_LOCATION或ACCESS_FINE_LOCATION权限来请求用户的权限。如果没有这些权限,您的应用程序将在请求位置更新时在运行时失败。
如果您同时使用NETWORK_PROVIDER和GPS_PROVIDER,则只需要请求ACCESS_FINE_LOCATION权限,因为它包含两个提供商的权限。 ACCESS_COARSE_LOCATION的权限仅允许访问NETWORK_PROVIDER。
警告:如果您的应用针对Android 5.0(API级别21)或更高版本,则必须声明您的应用使用清单文件中的android.hardware.location.network或android.hardware.location.gps硬件功能,具体取决于您的应用是从NETWORK_PROVIDER还是从GPS_PROVIDER接收位置更新。如果您的应用从这些位置提供商来源中收到位置信息,则需要声明应用在应用清单中使用这些硬件功能。在Android 5.0(API 21)之前运行版本的设备上,请求ACCESS_FINE_LOCATION或ACCESS_COARSE_LOCATION权限包括对位置硬件功能的隐含请求。但是,请求这些权限不会自动请求Android 5.0(API级别21)及更高级别的位置硬件功能。
我正在使用融合位置提供商,定位API 21,并使用ACCESS_FINE_LOCATION
。我没有特别关心GPS是否可用,只是报告了最准确的位置。
android.hardware.location.gps
和android.hardware.location.network
。或者这仅适用于LocationManager
而不是融合位置? 我是否需要android.hardware.location.gps
和android.hardware.location.network
?
答案 0 :(得分:18)
第二个引文告诉您,如果您特别需要一个或另一个位置提供商,则需要android.hardware.location.network
或android.hardware.location.gps
。
如果您想通过GPS进行更新,则需要android.hardware.location.gps
。
如果您想通过WiFi和蜂窝网络进行更新,则需要android.hardware.location.network
。
如果您需要来自网络和GPS的更新,则应同时包含<uses-feature>
元素。
如果您未指定,则可以在没有该提供商的设备上安装您的设备。例如,它可以安装在没有GPS,蜂窝网络或Wi-Fi芯片的设备上。
换句话说,获取位置需要网络位置功能或GPS功能。如果您未声明您的应用程序需要其中一个,则可能根本无法获得位置更新。
API 21 vs 20及以下
请注意,以上仅适用于API 21及更高版本。
在API 21之前,请求ACCESS_COARSE_LOCATION
权限隐含了location.network
功能,请求ACCESS_FINE_LOCATION
的用户隐含了location.gps
功能(请参阅<uses-feature>
)。
现在唯一的变化是,对于API 21+,任何请求ACCESS_FINE_LOCATION
的应用很快就可以安装在没有GPS的设备上。如果您的应用之前认为GPS可用(并且需要GPS),则需要确保您明确请求android.hardware.location.gps
。
谷歌表示,网络位置提供商现在已经足够好,可以提供优质的地理位置,因此也就是改变。
答案 1 :(得分:11)
TL; DR :不,您不必将uses-feature
添加到您的清单中,但可能会有所不同。
完整答案:
清单的 uses-feature
仅限于Google Play可以过滤掉不包含应用程序正确执行所必需的功能的设备。 (例如用于转弯导航应用的GPS,或用于相机应用的相机)。
仔细阅读这句话:
任何需要GPS硬件的应用程序,例如GPS导航仪,都应该明确添加&#34; android.hardware.location.gps&#34;使用功能到他们的清单
(...)
并希望从GPS接收最准确的位置样本
如您所述,您只关心FusedLocationProvider为您提供安装设备的最佳位置。这意味着,即使您要求PRIORITY_HIGH_ACCURACY
,您的应用也可能安装在不包含GPS的设备上,并且永远不会像GPS一样准确,或者甚至可能(在一些非常罕见的奇数中) case),安装在不包含任何位置提供者的设备上。
修改强>
基于第二个引用,我想我需要android.hardware.location.gps和android.hardware.location.network。或者这仅适用于LocationManager而不是融合位置?
我刚开始研究文档https://developer.android.com/guide/topics/manifest/uses-feature-element.html#hw-features并发现它非常有趣,有三种可能性:
所以基于此,如果你的应用程序无法在没有任何形式的位置的情况下工作,你应该使用第一个android.hardware.location
,否则,如果你的应用使用了位置,但它对其功能不是必不可少的,那么你可以免费包含任何内容
答案 2 :(得分:8)
快速简单的解决方案:
应用程序需要通过GPS使用android.hardware.location.gps进行更新。 如果您想通过WiFi和蜂窝网络进行更新,则需要android.hardware.location.network。
根据您的位置数据要求,在您的清单文件中添加以下行:
<uses-feature android:name="android.hardware.location" android:required="false" />
<uses-feature android:name="android.hardware.location.gps" android:required="false" />
希望这会有所帮助..
答案 3 :(得分:2)
根据我的理解,只需阅读uses-feature element的文档即可了解如何根据隐式和显式使用功能条目在Google Play中过滤应用程序:
Google Play会过滤用户可见的应用程序,以便用户只能查看和下载与其设备兼容的应用程序。过滤应用程序的方法之一是功能兼容性。
要确定应用程序的功能与给定用户的设备兼容性,Google Play会比较:
应用程序所需的功能 - 应用程序在其清单中的元素中声明功能 与... 设备上可用的功能,硬件或软件 - 设备将其支持的功能报告为只读系统属性。
...
如果明确声明某项功能是必需的,Google Play会将该功能添加到该应用程序所需功能列表中。然后,它会在不提供该功能的设备上过滤用户的应用程序。
如果明确声明某项功能不是必需的,则Google Play不会将该功能添加到所需功能列表中。因此,在过滤应用程序时,从不考虑明确声明的非必需功能。即使设备未提供声明的功能,Google Play仍会认为该应用与设备兼容,并会将其显示给用户,除非适用其他过滤规则。
位置权限的隐式uses-feature
项是:
android.hardware.location
android.hardware.location.network
(仅当目标API级别为20或更低时。)android.hardware.location
android.hardware.location.gps
(仅当目标API级别为20或更低时。) Google的电子邮件中描述的更改是,uses-feature
的隐含android.hardware.location.gps
项将不会出现在API 21+中ACCESS_FINE_LOCATION
。类似的情况似乎适用于ACCESS_COARSE_LOCATION
和android.hardware.location.network
。
Google鼓励明确枚举所有uses-feature
条目,但仍会根据权限提供隐式条目。从以下文档摘录中,我认为省略uses-feature
并声明不需要它之间没有区别,除非存在隐式uses-feature
条目。
如果明确声明某项功能不是必需的,则Google Play不会将该功能添加到所需功能列表中。
您的应用程序的用例确定应该出现uses-feature
个条目。以下是一些示例用例,除非另有说明,否则所有uses-feature
条目都是必需的:
应用程序明确使用来自LocationManager
的GPS或应用程序需要GPS&#39;高精确度。这是Google的电子邮件中给出的示例。
ACCESS_FINE_LOCATION
android.hardware.location
(隐含)android.hardware.location.gps
(隐含至API 20)明确使用网络位置
ACCESS_COARSE_LOCATION
android.hardware.location
(隐含)android.hardware.location.network
(隐含至API 20)使用GPS和网络
ACCESS_FINE_LOCATION
android.hardware.location
(隐含)android.hardware.location.gps
(隐含至API 20)android.hardware.location.network
使用GPS和网络中的至少一个。这是原始问题中的FusedLocationProviderApi案例。
ACCESS_FINE_LOCATION
/ ACCESS_COARSE_LOCATION
android.hardware.location
(隐含)如果可用,则使用位置,如果不可用,仍允许应用程序安装
ACCESS_FINE_LOCATION
android.hardware.location
required = false(覆盖隐式)android.hardware.location.gps
required = false(覆盖默认为API 20)答案 4 :(得分:1)
根据你的问题
根据第一个引文,我想我不需要做任何 变化。
您不需要进行任何更改,因为您正在使用FusedLocation
根据可用性自动检测GPS
和NetworkProvider
,并为您提供最佳估算位置(您需要添加ACCESS_FINE_LOCATION
权限才能获得高准确度。即使您定位在 API版本21 之上,您也不需要更改应用中的任何内容FusedLocation
将像以前一样工作。
根据第二次报价
您只需要忽略它,因为您使用FusedLocation
API并且您没有使用由LocationManager
替换的FusedLocation
API。因此,第二次报价仅适用于使用{{ 1}}。
NETWORK_PROVIDER和GPS_PROVIDER 是 LocationManager 非LocationManagar
API
答案 5 :(得分:1)
是的,如果您使用融合提供程序,则需要两个权限。
ACCESS_COARSE_LOCATION
- 要从NETWORK_PROVIDER
接收位置更新。添加android.hardware.location.network
功能权限就足够了。
ACCESS_FINE_LOCATION
- 从NETWORK_PROVIDER和GPS_PROVIDER
接收位置更新。您应该同时添加android.hardware.location.gps
和android.hardware.location.network
功能权限。适用于融合位置。