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

时间:2016-09-20 20:34:21

标签: android gps geolocation android-permissions android-gps

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

中详细了解此更改

来自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.gpsandroid.hardware.location.network。或者这仅适用于LocationManager而不是融合位置?

我是否需要android.hardware.location.gpsandroid.hardware.location.network

6 个答案:

答案 0 :(得分:18)

第二个引文告诉您,如果您特别需要一个或另一个位置提供商,则需要android.hardware.location.networkandroid.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
  • android.hardware.location.gps
  • android.hardware.location.network

所以基于此,如果你的应用程序无法在没有任何形式的位置的情况下工作,你应该使用第一个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项是:

ACCESS_COARSE_LOCATION

  • android.hardware.location
  • android.hardware.location.network(仅当目标API级别为20或更低时。)

ACCESS_FINE_LOCATION

  • android.hardware.location
  • android.hardware.location.gps(仅当目标API级别为20或更低时。)

Google的电子邮件中描述的更改是,uses-feature的隐含android.hardware.location.gps项将不会出现在API 21+中ACCESS_FINE_LOCATION。类似的情况似乎适用于ACCESS_COARSE_LOCATIONandroid.hardware.location.network

Google鼓励明确枚举所有uses-feature条目,但仍会根据权限提供隐式条目。从以下文档摘录中,我认为省略uses-feature并声明不需要它之间没有区别,除非存在隐式uses-feature条目。

  

如果明确声明某项功能不是必需的,则Google Play不会将该功能添加到所需功能列表中。

您的应用程序的用例确定应该出现uses-feature个条目。以下是一些示例用例,除非另有说明,否则所有uses-feature条目都是必需的:

  1. 应用程序明确使用来自LocationManager的GPS或应用程序需要GPS&#39;高精确度。这是Google的电子邮件中给出的示例。

    • ACCESS_FINE_LOCATION
    • android.hardware.location(隐含)
    • android.hardware.location.gps(隐含至API 20)
  2. 明确使用网络位置

    • ACCESS_COARSE_LOCATION
    • android.hardware.location(隐含)
    • android.hardware.location.network(隐含至API 20)
  3. 使用GPS和网络

    • ACCESS_FINE_LOCATION
    • android.hardware.location(隐含)
    • android.hardware.location.gps(隐含至API 20)
    • android.hardware.location.network
  4. 使用GPS和网络中的至少一个。这是原始问题中的FusedLocationProviderApi案例。

    • ACCESS_FINE_LOCATION / ACCESS_COARSE_LOCATION
    • android.hardware.location(隐含)
  5. 如果可用,则使用位置,如果不可用,仍允许应用程序安装

    • ACCESS_FINE_LOCATION
    • android.hardware.location required = false(覆盖隐式)
    • android.hardware.location.gps required = false(覆盖默认为API 20)

答案 4 :(得分:1)

根据你的问题

  

根据第一个引文,我想我不需要做任何   变化。

您不需要进行任何更改,因为您正在使用FusedLocation根据可用性自动检测GPSNetworkProvider,并为您提供最佳估算位置(您需要添加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.gpsandroid.hardware.location.network功能权限。适用于融合位置。