Fused Location GPS 在打开 Google 地图之前不会更新

Fused Location GPS doesn't update until opening Google Maps

我在我的应用程序中使用融合位置提供程序,它设置为 PRIORITY_HIGH_ACCURACY,间隔为 60 秒。这通常有效,但有时位置不会自行更新 5 到 10 分钟,而当我打开 Google 地图时,它似乎会触发位置更新。

这里还有其他人可能 运行 了解此问题或知道此行为背后的可能原因吗?有什么办法可以解决这个问题吗?

Gps 并不总是 return 一个位置,即使它可以通过 FusedLocationProvider api 或 LocationManager LocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) 获得。特别是,如果您在室内,则不太可能从 Gps 获取位置,具体取决于您设备的 Gps 芯片。 GPS 必须固定到 return 一个位置。

您可以编写一个测试应用程序,其中包含带有 Gps、Wifi 和 GpsStatusListener 的 LocationManager,以检查卫星数量、定位中的卫星和卫星信号强度,同时将其与 FusedLocationProvider 进行比较,并将提供的位置添加到地图作为标记。您还可以查找 FLP 的 Location.getExtras(),其中可能包含有关卫星的信息。即使 LocationManager Gps 可用且卫星数量为 2,我也无法从 Gps 获取位置。

图像中的 Hello World 应该是 Gps 位置,但尚未 returned,因为它尚未修复。 测试可能无法解决您的问题,但您可以比较您获得位置的情况,或者您不能例如可能需要使用 3 颗卫星从 Gps 或最小信号强度获得位置。 Gps 也可能需要很长时间才能锁定,并且 GpsStatusListener 上的状态在锁定时会设置为 GpsStatus.GPS_EVENT_FIRST_FIX。我花了大约 5 分钟的时间来固定 Gps 和 return 一个位置。我还用地图编写了另一个测试,我遇到了同样的问题,直到 Gps 在 LocationManager 和 FLP 上都得到修复。

我从以下内容中得到的发现 如果至少有一个客户端连接到它,Fused Location Provider 将仅维护后台位置。一旦第一个客户端连接,它将立即尝试获取位置。如果您的 activity 是第一个连接的客户端并且您在 onConnected() 中立即调用 getLastLocation(),那么第一个位置可能没有足够的时间进入。这将导致位置null.

要解决此问题,您必须(不确定地)等待提供者获取位置然后调用 getLastLocation(),这是不可能知道的。

另一个(更好的)选择是实现 com.google.android.gms.location.LocationListener 接口以接收定期位置更新(并在获得第一次更新后将其关闭)。