使用 getAccuracy 错误
Posted
技术标签:
【中文标题】使用 getAccuracy 错误【英文标题】:Using the getAccuracy wrong 【发布时间】:2013-01-20 14:27:34 【问题描述】:我正在构建一个基于位置的应用程序,我想避免使用这种位置:“特拉维夫,特拉维夫,以色列”,这是非常不准确的。
我在使用位置之前使用以下条件:
if(!(this.location == null || this.location.getAccuracy() > 700))
// use the location
但我不断得到这个位置(特拉维夫、特拉维夫、以色列),而特拉维夫还不够小,无法通过这个条件。
我错过了什么?怎么了?
【问题讨论】:
【参考方案1】:你没有指定几个参数,但我会试一试。
确切的Location
参数取决于特定Location
的来源,即它是如何获得的以及使用什么地理位置来源。例如:
Location
将具有可靠的 accuracy
值。
如果您使用蜂窝网络无线电台 (BTS),您收到的准确度将受限于全球 BTS 的数据库、它们的位置和范围。
如果您使用 Wi-Fi 网络及其报告的信号强度,准确性将取决于 Wi-Fi 网络数据库的质量。不幸的是,这样的数据库维护和创建并不便宜。例如,Google 购买此类数据库并使用 Google Street View 汽车扫描此类网络。
如果您使用基于公共 IP 地址的本地化,您的准确性将仅限于城镇,因为这是 IANA IP 地址空间注册表中包含的最准确信息。此外,还可以通过使用代理服务器来欺骗它。
您将从定位服务获得的准确度表示与报告的位置之间的距离(以米为单位),在获得位置的那一刻,设备可能所处的位置。
所以(如果我正确理解您的问题),我认为您使用的是获取当前设备位置的低准确度方法。您只需更准确地切换到Location
的来源。
还请注意,定位服务所使用的位置获取方法(即如上所述用于查找位置的服务)实际上可能无法提供准确度返回的Location
.要理解我的意思,请考虑以下场景及其两个结果 - 请注意,它们都来自基于 Wi-Fi 网络的相同定位方法:
-
您位于多个 Wi-Fi 网络的范围内。您向定位服务询问设备位置。范围内的所有 Wi-Fi 网络恰好位于位置服务数据库中。因此,定位服务能够以相当准确的方式获取您的位置。
您位于多个 Wi-Fi 网络的范围内。然而,它们中的任何一个都不为定位服务所熟知,因为它们的起源(城镇)是已知的,但它们的确切位置和范围是未知的。在这种情况下,定位服务能够告诉您您所在的国家/城镇,但不知道您的确切位置。反过来,位置服务可以为您提供不准确的位置。
您必须通过测试是否完全可用,为这种情况做好准备。您可以通过发出Location.hasAccuracy()
来做到这一点。如果返回值是false
,你不能调用Location.getAccuracy()
(实际上你可以,但要注意——它会返回0
!)。所以,你的情况应该更像:
if (this.location != null && this.location.hasAccuracy() && this.location.getAccuracy() < 700)
// do something
【讨论】:
感谢您的详细解答!我正在使用 gps 和网络提供商,因为我的用户可能在室内和室外。我猜我所说的位置是由网络提供商生成的。但我仍然不明白它是如何通过我的条件的......城市级别的准确度比 700 大得多。也许答案是你所说的“位置服务实际上可能无法为返回的位置提供准确度”是什么那是什么意思?它非常不准确,所以它没有准确或只是一个错误? 就是这个意思。这不是一个错误!在将getAccuracy()
与任何东西进行比较之前,请记住始终检查Location.hasAccuracy()
是否为true
。您不能假设基于可用网络的位置的准确度会大于700
。考虑到 Google 使用他们的网络位置数据库来为您提供更准确的位置。此检查的您的目的是什么?如果您想根据可用网络了解该位置是否到达,请检查Location.getProvider()
值。
谢谢,我检查一下,因为我的应用每 5 分钟向数据库发送一次用户位置,如果位置不准确,我想忽略它并坚持使用旧位置。
@ImriPersiado 当然,这是很常见的事情,这就是 hasAccuracy()
的目的 - 所有支持准确度的位置提供者都将其设置为 true
并将位置的准确度设置为有效值。所以我认为答案末尾的检查正是您所需要的:)以上是关于使用 getAccuracy 错误的主要内容,如果未能解决你的问题,请参考以下文章