我什么时候需要android.hardware.location.gps和android.hardware.location.network?

mat*_*ttm 31 gps android geolocation android-permissions android-gps

Google会通过电子邮件通知Android位置权限的更改:

我们将在2016年10月15日进行更改,这将影响使用ACCESS_FINE_LOCATION但未明确拥有"android.hardware.location.gps"使用功能的API版本21(Android 5.0,Lollipop)或更高版本的应用.展望未来,这些应用程序可以安装在没有GPS硬件的设备上.在大多数情况下,这不会成为问题,因为基于Wi-Fi和基于Cell-ID的位置为这些应用的典型操作提供了足够高的保真度.但是,任何需要GPS硬件的应用程序(例如GPS导航仪)都应该明确地将"android.hardware.location.gps"使用功能添加到其清单中.

如果您的应用需要GPS才能正常运行且您的清单声明中未包含,则您的用户可能会遇到较差的应用体验.

此外,如果您正在使用融合位置提供商并希望从GPS接收最准确的位置样本(即使用PRIORITY_HIGH_ACCURACY),则必须在应用清单中包含"android.hardware.location.gps"功能,以确保Google Play只会将您的应用分发给配备GPS传感器的设备.

您可以在Android开发者帮助中心中详细了解此更改.

来自Android开发者帮助中心

要从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.gpsandroid.hardware.location.network.或者这仅适用于LocationManager融合位置?

我需要android.hardware.location.gpsandroid.hardware.location.network不?

Tan*_*.7x 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.

谷歌表示,网络位置提供商现在已经足够好,可以提供优质的地理位置,因此也就是变化.

  • 亲爱的downvoter:我很感激您的反馈意见,以便我可以改进这个答案,如果它不完整或不正确. (10认同)
  • 我很遗憾花了这么长时间发表反馈,我正在写完我的答案.我贬低它是因为据我的理解,你的答案是不正确的.`uses-feature`只是可以安装你的应用程序的设备上的过滤器,并且根据OP问题,他只需要一些位置,而不一定需要来自GPS的位置.在我的回答中,我捍卫并进一步解释这一点,我欢迎你发表评论,反驳论点等 (4认同)

Bud*_*ius 13

TL; DR:不,你不必添加uses-feature到你的清单,但你可以依赖.

完整答案:

uses-feature清单只是为了让Google Play可以过滤掉不包含应用程序正确执行所必需的功能的设备.(例如GPS用于转弯导航应用程序,或相机用于相机应用程序).

仔细阅读这句话:

任何需要GPS硬件的应用程序,例如GPS导航仪,都应该明确地将"android.hardware.location.gps"使用功能添加到其清单中

(......)

并希望从GPS接收最准确的位置样本

如您所述,您只关心FusedLocationProvider为您提供安装设备的最佳位置.这意味着,即使您正在请求PRIORITY_HIGH_ACCURACY,您的应用可能会安装在不包含GPS的设备上,并且永远不会像GPS一样准确,或者甚至(在某些非常罕见的情况下)安装在设备上不包含任何位置提供者.

编辑:

基于第二个引用,我想我需要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
  • android.hardware.location.gps
  • android.hardware.location.network

基于此,如果您的应用程序无法在没有任何形式的位置的情况下工作,您应该使用第一个android.hardware.location,否则,如果您的应用程序使用位置但它对其功能不是必不可少的,您可以自由地不包含任何内容

  • 如果您的应用程序不需要位置,您仍应包含`<uses-feature>`元素,但将`required`设置为false.通过请求位置权限,您意味着您需要位置功能,并且您的应用可能无法用于没有任何位置功能的设备. (3认同)

Jat*_*tin 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" />
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助..

  • 我相信你想要的第一个是android.hardware.location.network (2认同)