为啥Android会在“新鲜”位置之后返回“陈旧”位置?

Posted

技术标签:

【中文标题】为啥Android会在“新鲜”位置之后返回“陈旧”位置?【英文标题】:Why does Android return a "stale" location after a "fresh" one?为什么Android会在“新鲜”位置之后返回“陈旧”位置? 【发布时间】:2017-11-02 10:01:13 【问题描述】:

我有一个位置感知 android 应用,它使用 FusedLocationApi 进行位置管理。

当应用需要获取其位置时,它首先会获取最后一个已知位置。如果位置不超过一分钟,则使用该位置,否则等待新的位置更新。

现在,当四处移动时,比如从位置 A 到 B,我观察到以下行为。一旦我到达 B,应用程序就会报告 B 的位置,这很好,并且是预期的行为。但是,有时,该应用程序会在此后不久报告 A 的位置。鉴于它已经将当前位置更新为 B,这怎么可能呢?

【问题讨论】:

【参考方案1】:

当您到达 B 时,它应该将最后一个位置显示为“B” 但请确保您在这里经常更新您的位置,您可以设置位置请求。

LocationRequest locationRequest locationRequest = new LocationRequest();
        locationRequest.setInterval("4000"); //Interval 
        locationRequest.setFastestInterval("4000");//Fast Interval
        locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

【讨论】:

我的代码实际上看起来像上面。我不明白的是应用程序最初如何正确更新到 B 然后突然恢复到 A。 两个位置之间的距离是多少。 ?我的意思是够远了吗? 全长约4公里,约需5分钟。 哦..那么代码中一定有问题。调试它。您可能会找到解决方案。【参考方案2】:

作为 FusedLocationAPI 结果的类 Location 有一个 getTime() 函数。当您收到位置更新时,您可以使用 getTime 函数与前一个进行比较,以查看哪个更新。

【讨论】:

【参考方案3】:

确保明智地使用这些参数。因为它会影响电池和应用性能。

//update interval
setInterval(UPDATE_INTERVAL);
//Fastest interval
setFastestInterval(FASTEST_INTERVAL);
//Accuracy required
setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
//Smallest variation in between locations
setSmallestDisplacement(MIN_DISTANCE_CHANGE_FOR_UPDATES);

由于您可能没有设置 setSmallestDisplacement ,因此可能会导致重新检索相同的旧位置。

【讨论】:

以上是关于为啥Android会在“新鲜”位置之后返回“陈旧”位置?的主要内容,如果未能解决你的问题,请参考以下文章

Android:位置服务每次返回不同的数字 - 为啥?

为啥Android有时无法获取位置

redigo 连接池 - 为啥在删除陈旧连接时释放锁

Android模拟器GPS位置给出了错误的时间

为啥 fusedLocationProviderClient.getLast 位置总是返回 null?

为啥使用 ia-wrapper 将后续项目上传到 archive.org 时仍然存在陈旧的标头值?