使用Google API的后台位置更新 - 融合位置提供程序不准确

12

我一直在使用 GoogleApiClient 进行基于时间间隔和位移的后台位置更新的工作和测试。经过几天的测试和分析,我发现了一些输出中的变化,这是我没有预料到的。

  1. 在使用基于时间间隔的更新时,我使用 setIntervalsetFastestInterval,比如我将时间间隔设置为15分钟,最快间隔设置为10分钟,90%的时间我会在预期的间隔(10到15分钟)内得到更新。但有时我注意到更新所需的时间比指定的间隔要长得多,差异约为30分钟和60分钟左右。你有任何想法吗?

  2. 在使用基于距离的更新时,我使用了 setMinimumDisplacement,比如我将位移设置为200米,只有在达到200米及以上的静止点才会得到更新(即使在旅行途中,如果距离超过200米,也不会更新)。这正常吗?

我正在使用PendingIntent类型的位置请求以接收后台位置更新的广播接收器中的位置更新。

fusedLocationProviderClient.requestLocationUpdates(locationRequest, pendingIntent);

在测试期间,位置服务开启状态且位置模式设置为高精度


3
我不能说这是正常行为,但我见过类似于你的问题。实话实说,@Mitesh Vanaliya 所引用的文档答案是:所有位置请求都被视为提示,你可能会收到比请求更/少准确、更/少快速的位置。或者换句话说,“你可以告诉我们你想要什么,有时我们会按照你的要求执行,但最终我们会按照我们自己的意愿和时间操作”。 - Gary99
如果您不想使用Google推荐的“FusedLocationApi”,可以使用旧版本的LocationManager来获得更多自主控制。这里提供了一些如何进行操作的信息。 - Gary99
我不想使用 LocationListener,因为当应用程序终止时它也会被终止。我希望即使应用程序终止也能获取位置更新,这就是为什么我选择了 FusedLocationProviderClientrequestLocationUpdatesPendingIntent 版本。从 setInterval 获取的更新比 setMinimumDisplacement 更好,因为来自 setInterval 的位置更准确。 - Joshua
由于我有一些基于用户行驶距离的进程需要完成,因此我希望它至少以1公里的精度提供位置更新。但是_setMinimumDisplacement_的问题在于,只有当用户停在某个地方时才会提供更新。即使用户连续行驶并超过指定的最小位移范围,我也没有得到任何更新。是否有其他方法或实现方式可以确保我至少获得基于指定距离的位置更新? - Joshua
我在我的尝试中也遇到了类似的问题。请查看我的问题以及来自fellow SO的答案 https://stackoverflow.com/questions/35745924/location-from-gps-provider-or-network-provider-in-android-is-not-consistent - Sreehari
@Stallion 我认为你遇到的问题对于你使用的代码和api来说是正常的。根据你标记为最佳答案的回答,加速度计、陀螺仪和磁力计基础数据是获取更准确数据的最佳方式。根据这个文档,其准确度只有约68%。但在我的情况下,setMinimumDisplacement甚至不接近近似值。我已经在问题的第二点中解释了它。 - Joshua
2个回答

4
请参考文档以了解 LocationRequest API 的正确使用方法。
LocationRequest Api 文档 中获得以下信息:
  • 应用程序无法指定精确的位置源,例如 GPS,用于 LocationClient。实际上,系统可能有多个位置源(提供程序)运行,并将几个来源的结果融合成一个单独的位置对象。
  • 具有 ACCESS_COARSE_LOCATION 而非 ACCESS_FINE_LOCATION 权限的应用程序的位置请求将自动被节流到较慢的间隔,并且位置对象将模糊化,仅显示粗略的准确度级别。
  • 所有位置请求都被视为提示,您可能会收到比所请求的速度更快/更慢,更/不太准确的位置
要获取更详细的说明,请阅读上面链接中的完整文档。
希望这些说明能对您有所帮助。

1
谢谢您的解释。我已经了解了有关位置来源和准确性的一些信息。我期望在问题的第二点中获得更多信息,例如,这通常是如何工作的?还是我需要实现更多的代码来完成它? - Joshua

0

我已经找到了答案来回答我的第二个问题。文档说不建议将setMinimumDisplacement设置为0,但这正是解决问题的方法。当它被设置为0时,它按预期工作。

当有两个不同的LocationRequest(基于间隔和位移)时,它可以正确地工作,以便一个设置不会影响另一个。

对于上述情况,最好使用前台服务,以便位置更新不会被操作系统杀死。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接