当前位置: 首页 > 知识库问答 >
问题:

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

余弘新
2023-03-14

谷歌正在通过电子邮件通知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接收最准确的位置样本(即具有高精度的优先级),则必须在应用程序清单中包含“android.hardware.location.GPS”功能,以确保Google Play仅将您的应用程序分发给带有GPS传感器的设备。

你可以在Android开发者帮助中心阅读更多关于这一变化的信息。

来自Android开发者帮助中心

为了接收来自网络_提供商或GPS_提供商的位置更新,您必须通过在Android清单文件中分别声明访问_粗略_位置或访问_精细_位置权限来请求用户的权限。如果没有这些权限,您的应用程序在请求位置更新时将在运行时失败。

如果同时使用NETWORK_PROVIDER和GPS_PROVIDER,则只需要请求ACCESS_FINE_LOCATION权限,因为它包含两个提供程序的权限。ACCESS_COARSE_LOCATION权限只允许访问NETWORK_PROVIDER。

警告:如果你的应用目标是Android 5.0(API级别21)或更高版本,你必须声明你的应用使用Android。硬件地方网络或Android系统。硬件地方清单文件中的gps硬件功能,取决于您的应用程序是从网络_提供商还是从gps_提供商接收位置更新。如果你的应用程序从这些位置提供商来源中接收到位置信息,你需要在你的应用程序清单中声明该应用程序使用了这些硬件功能。在运行Android5.0(API 21)之前版本的verions的设备上,请求访问\u FINE_LOCATION或访问\u rough_LOCATION权限包括对位置硬件功能的隐含请求。然而,请求这些权限并不会自动请求Android 5.0(API级别21)及更高版本上的位置硬件功能。

我正在使用融合位置提供程序,目标是API 21,并使用ACCESS\u FINE\u location。我并不特别关心GPS是否可用,只是报告了最准确的位置。

  • 根据第一句话,我想我不需要做任何改变

我需要Android吗。硬件地方gps和Android系统。硬件地方网络?

共有3个答案

凌成天
2023-03-14

快速简单的解决方案:

应用程序需要使用android通过GPS进行更新。硬件地方全球定位系统。如果你想通过WiFi和蜂窝网络进行更新,你需要Android系统。硬件地方网络

根据您的位置数据要求,在清单文件中添加以下行:

<uses-feature android:name="android.hardware.location.network" android:required="false" />
<uses-feature android:name="android.hardware.location.gps" android:required="false" />

希望这有助于...

柯阳曦
2023-03-14

太长别读:不,您不必将uses-特性添加到清单中,但根据具体情况,您可能会添加

完整答案:

清单的uses-特性仅用于Google Play可以过滤掉不包含应用程序正确执行所需功能的设备。(示例是用于转弯导航应用程序的GPS,或用于相机应用程序的相机)。

仔细阅读这段话:

任何需要GPS硬件的应用,比如GPS导航器,都应该在其清单中明确添加“android.hardware.location.GPS”使用功能

(...)

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

正如您所提到的,您只关心FusedLocationProvider为您提供设备安装时可用的最佳位置。这意味着,即使您请求的是优先级\u高精度,您的应用程序也可能安装在不包含GPS的设备上,并且永远无法获得像GPS那样精确的位置,或者甚至(在某些非常罕见的情况下)安装在不包含任何位置提供商的设备上。

编辑:

根据第二句话,我想我需要两个Android系统。硬件地方gps和Android系统。硬件地方网络或者这只是针对LocationManager而不是fused location?

我只是去查医生https://developer.android.com/guide/topics/manifest/uses-feature-element.html#hw-并发现它非常有趣,有3种可能性:

  • Android。硬件地点

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

步博厚
2023-03-14

第二句话告诉你,你需要android。硬件地方网络或Android系统。硬件地方gps,如果您特别需要一个或另一个位置提供商。

如果你想通过GPS进行更新,你需要android。硬件地方gps。如果你想通过WiFi和蜂窝网络进行更新,你需要Android系统。硬件地方网络。

如果您想同时从网络和GPS获得更新,则应同时包含

如果您没有指定这两个选项,您的设备可能安装在没有该提供商的设备上。例如,它可能安装在没有GPS、蜂窝网络或Wi-Fi芯片的设备上。

换句话说,获取位置需要网络定位功能或GPS功能。如果你没有声明你的应用程序需要其中一个,你可能根本得不到位置更新。

API 21 vs 20及以下

请注意,以上仅适用于API 21及以上版本。在API 21之前,请求ACCESS\u rough\u LOCATION权限意味着位置。网络功能,当请求访问_FINE_LOCATION时暗示了位置。gps功能(请参见

目前唯一的变化是,对于API 21,任何请求ACCESS_FINE_LOCATION的应用程序都将很快可以安装在没有GPS的设备上。如果您的应用程序之前假设GPS可用(并且需要GPS),您需要确保您有对android.hardware.location.gps的明确请求。

谷歌表示,网络定位提供商现在已经足够好,可以进行精细定位,因此发生了变化。

 类似资料:
  • 问题内容: 我使用类只有很短的时间,编写方法时,我使所有变量都引用了self,例如self.foo。 但是,我在浏览《 wxPython in Action》 一书时发现,“ self”并没有一直使用。例如: 下面的一个确实使用“自我”。 如果我没记错的话,“自我”是指该类的特定实例,那么什么时候没有必要?有一般的经验法则吗? 问题答案: 您用于引用当前实例的属性。 您用于引用父类的方法。 如果仅

  • 问题内容: 我对JAX-WS进行了概述,并注意到了(和)的一些引用。 在什么情况下需要?(我认为JSR 109服务器?!) 问题答案: 是使用SUN的参考实现将Web服务作为标准存档部署在非Java EE5 Servlet容器上时所需的专有部署描述符。 Sun的RI 用作servlet上下文事件的侦听器和调度程序servlet。两者都必须在中声明。然后需要该文件为定义Web服务端点,以使其知道必须

  • 在回答“亚马逊DynamoDB吞吐量是如何计算和限制的?”有人建议,只要超出每秒预配的吞吐量,DynamoDB就会限制请求。然而,这与我的经验相矛盾。 我在一个表中发布了多行,通常行数远远超过了配置的写容量。这种情况会在短时间内发生。在某一点上,我甚至有5分钟的平均时间超过了规定的容量。OTOH,平均15分钟低于容量。在那段时间里,我没有收到任何限制性的请求。 15分钟的平均峰值远低于规定的容量:

  • 如题, 在将包含汉字的数据转json存的时候,什么时候需要转unicode存储,什么时候不需要 如下: {"subject":"\u6395\u7268\u51ef\u86c1"} {"subject":"吃饭了没"}

  • 问题内容: 当我尝试按照本指南进行SQLAlchemy Relation Example时:基本关系模式 我有这个代码 它运作良好,但是在指南中,该模型应为: 为什么我不需要或在我的示例中?什么时候应该使用其中一个? 问题答案: 如果使用,则无需在第二个表上声明关系。 如果 不 使用,并分别定义,则如果不使用,则sqlalchemy将不知道如何连接关系,因此修改一个也将修改另一个。 因此,在您的示