Android 位置 GPS 跟踪

问题描述

我有一个带有 Android GPS API 地图片段的小型测试应用程序。我使用 FusedLocationProvider。目标SDK=29。使用 Java。

只要应用程序处于活动状态,它就会运行得很漂亮。在 locationUpdates 上,我向轨道添加一个新点,一切看起来都很棒并且保持准确。目标是跟踪我的远足、总距离和跟踪并将其显示在地图上。效果很好。

一旦我锁定手机或失去焦点,更新就会停止,我将不再获得位置更新。

解决方案似乎是:

我已经翻遍了文档、StackOverflow、我能找到的所有示例/教程、developer.android.com 等。我已经从 GitHub 下载了后两个示例;他们看起来非常迟钝(可能只有我自己)。

  1. ForegroundService 与 PendingIntent 的优缺点是什么?
  2. 一个简单的例子来说明当你的手机被锁在口袋里或其他一些应用程序处于活动状态时实现位置更新的最小功能怎么样?只是模板的最低要求。
  3. 我需要保存在我的应用程序未激活或手机被锁定时发生的位置更新;以便在活动恢复到应用程序时填写跟踪。

从我的工作应用到维护位置更新和保存数据的一些简单的端到端指导会很棒。

解决方法

好的 - 我已经以迂回的方式回答了我的问题。

我一直在搜索“当应用程序不活动时检索位置更新”。这就引出了后台服务、前台服务、pendingIntents等各种解决方案。

我最终发现,如果你只是启动一个带有通知的前台服务,即使你的手机被锁定或者你切换了活跃的应用程序,你的应用程序也会继续接收位置更新;因为前台服务在同一线程中运行,因此会激活您的应用代码(如果我理解正确的原因)。

所以,我开始研究如何启动前台服务。任何人都知道最近试图解决这个问题,这在最近的版本中已经改变了多次。 developer.android.com 上的在线文档不是最新的。您会花很多时间想知道为什么按照这些文档操作不起作用。

最终,通过搜索如何启动前台服务,我遇到了这个简单而直接的(非 youtube 视频 - 你不只是讨厌这些东西)教程。 https://androidwave.com/foreground-service-android-example/

我刚刚将此代码添加到我现有的映射代码中,该代码在应用程序处于活动状态时工作,并通过锁定手机并将其放入口袋和切换应用程序并执行相同的操作进行测试。它似乎解决了问题。

更新:添加了代码,以计算位置更新的次数以及手持手机、屏幕打开和应用处于活动状态的每次更新的平均准确度作为基准。手机锁定,或应用程序未激活,更新次数和准确性没有区别。手机锁在口袋里,更新次数没有区别,但准确率从平均10m到平均13m受到影响;可以预料,我在口袋里假设。