谷歌正在通过电子邮件通知Android位置权限的更改:
我们将在2016年10月15日做出改变,这将影响针对API 21 (Android5.0,Lollipop)或更高版本的应用程序,这些应用程序使用ACCESS_FINE_LOCATION,但没有明确的"android.hardware.location.gps“使用功能。展望未来,这些应用程序将可以安装在没有GPS硬件的设备上。在大多数情况下,这不会是一个问题,因为Wi和基于手机ID的位置为这些应用程序的典型操作提供了足够高的保真度。然而,任何需要GPS硬件的应用程序,如GPS导航器,都应该显式地在它们的清单中添加"android.hardware.location.gps“使用特性。 如果您的应用程序需要GPS才能正常工作,并且您不包括在您的清单声明中,您的用户可能有一个糟糕的应用程序体验。 此外,如果您使用的是融合定位提供商,并且希望从全球定位系统(即使用PRIORITY_HIGH_ACCURACY)接收最精确的定位样本,则必须在应用程序的清单中包含"android.hardware.location.gps“功能,以确保Google只将应用分发给具有全球定位系统传感器的设备。 您可以在Android开发者帮助中心中阅读更多有关此更改的内容。
为了从NETWORK_PROVIDER或GPS_PROVIDER接收位置更新,您必须在Android清单文件中分别声明ACCESS_COARSE_LOCATION或ACCESS_FINE_LOCATION权限,以请求用户的许可。如果没有这些权限,当请求位置更新时,应用程序将在运行时失败。 如果同时使用NETWORK_PROVIDER和GPS_PROVIDER,则只需要请求ACCESS_FINE_LOCATION权限,因为它包括两个提供程序的权限。ACCESS_COARSE_LOCATION的权限只允许访问NETWORK_PROVIDER。 警告:如果应用程序的目标是Android5.0 (API 21)或更高版本,则必须声明应用程序使用清单文件中的android.hardware.location.network或android.hardware.location.gps硬件功能,这取决于应用程序是从NETWORK_PROVIDER还是从GPS_PROVIDER接收位置更新。如果您的应用程序从这些位置提供程序源中接收到位置信息,则需要声明应用程序在应用程序清单中使用了这些硬件功能。在运行Android5.0之前的设备(API 21)上,请求ACCESS_FINE_LOCATION或ACCESS_COARSE_LOCATION权限包括对位置硬件特性的隐含请求。但是,请求这些权限并不会自动请求Android5.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吗?
发布于 2016-09-20 20:39:51
第二个引号告诉您,如果您特别需要一个或另一个位置提供程序,则需要android.hardware.location.network或android.hardware.location.gps。
如果你想通过全球定位系统更新,你需要android.hardware.location.gps。如果您希望通过WiFi和蜂窝网络进行更新,则需要android.hardware.location.network。
如果您想要从网络和全球定位系统更新,您应该包括两个<uses-feature>元素。
如果两者都不指定,则您的设备可能安装在没有该提供程序的设备上。例如,它可以安装在没有GPS、蜂窝网络或Wi芯片的设备上。
换句话说,获取位置需要网络位置特征或GPS特征。如果您不声明您的应用程序需要一个或另一个,则可能根本得不到位置更新。
API 21 vs 20及以下
请注意,上面的内容只适用于API 21和更高版本。在API 21之前,请求ACCESS_COARSE_LOCATION权限意味着location.network特性,而请求ACCESS_FINE_LOCATION意味着location.gps特性(参见)。
现在唯一的变化是,对于API 21+,任何请求ACCESS_FINE_LOCATION的应用程序很快就可以安装在没有GPS的设备上。如果您的应用程序之前假设GPS是可用的(并且需要GPS),您需要确保您有明确的android.hardware.location.gps请求。
谷歌说,网络位置提供商现在已经足够好的一个良好的位置,因此,改变。
发布于 2016-09-20 20:48:52
TL;博士:不,您不必将uses-feature添加到您的清单中,但取决于您是否可以添加uses-feature。
完整答案
清单的uses-feature只是为了使Google能够过滤掉不包含应用程序正确执行所必需的功能的设备。(例如,GPS用于逐转导航应用程序,或用于相机应用程序的照相机)。
仔细阅读这句话:
任何需要GPS硬件的应用程序,如GPS导航器,都应该显式地在它们的清单中添加"android.hardware.location.gps“使用特性。 (...) 并希望从GPS获得最精确的定位样本。
正如您所提到的,您只关心安装了FusedLocationProvider为您提供了设备可用的最佳位置。这意味着,即使您请求PRIORITY_HIGH_ACCURACY,您的应用程序可能会安装在不包含GPS的设备上,并且永远无法获得像GPS那样精确的位置,或者甚至(在一些非常罕见的奇怪情况下)安装在不包含任何位置提供商的设备上。
编辑:
根据第二个报价,我想我需要android.hardware.location.gps和android.hardware.location.network。或者这只适用于LocationManager而不是融合位置?
我刚开始研究docs https://developer.android.com/guide/topics/manifest/uses-feature-element.html#hw-features,发现它非常有趣,有3种可能性:
因此,如果您的应用程序没有任何形式的位置就不能工作,那么您应该使用第一个android.hardware.location,否则,如果您的应用程序使用位置,但它对它的趣味性并不重要,您可以自由地不包含任何内容。
发布于 2016-09-22 06:05:45
快速而简单的解决方案:
应用程序需要通过GPS更新使用android.hardware.location.gps。如果您希望通过WiFi和蜂窝网络进行更新,则需要android.hardware.location.network。
根据位置数据要求,在清单文件中添加以下行:
<uses-feature android:name="android.hardware.location.network" android:required="false" />
<uses-feature android:name="android.hardware.location.gps" android:required="false" />希望这有帮助..。
https://stackoverflow.com/questions/39603270
复制相似问题