如何实现用户当前位置的实时更新?

时间:2012-02-07 15:02:01

标签: android google-maps geolocation mylocationoverlay

我正在使用MyLocationOverlay来显示当前位置。但是,该位置需要一段时间才能更新。我想在iPhone上实现类似“跟我来”的功能,其中用户的位置也在用户移动时移动。如何使MyLocationOverlay的标记在其位置上执行实时更新?

请注意我覆盖了draw()和drawMyLocation(),因为我需要绘制一个自定义标记。

我当前的代码如下所示:(我的代码的问题是标记不会随用户一起移动。因为在调用onLocationChanged之前需要一段时间,标记会突然从一个地方跳到另一个地方。 )

@Override
public synchronized void onLocationChanged(Location location)
{
    if (location != null && mapController != null)
    {
        //Recenter map based on current location
        mapController.animateTo(new GeoPoint((int) (location.getLatitude() * 1e6), (int) (location.getLongitude() * 1e6)));
    }
    super.onLocationChanged(location);
}

1 个答案:

答案 0 :(得分:2)

您可以给位置管理器提供最小间隔,以便在调用该方法之间等待,但是并不是在100%的时间内完全记住该间隔(请参阅LocationManager.requestLocationUpdates()的说明)。可能更短,可能更长 - 因为,例如它可能是阴天,gps芯片将无法像您希望的那样定期更新位置。

没有正确的方法可以解决这个问题 - 位置服务总是存在不完善之处。我使用的每个位置感知应用程序都会不时“挂起”标记因为gps芯片丢失修复片刻。

你可以做的唯一一点就是要记住移动的速度,并且应该gps丢失修复,根据假设用户以相同的速度向同一方向移动,给地图标记假更新是什么时候gps有一个修复。但只有2-5跳过真正的更新才能做到这一点(只是为了平滑修复丢失几秒钟的情况)。

UPD 为此,您可以实现一种代理位置监听器,它会更新您的标记,严格指定您指定的间隔,例如:每200毫秒,并根据它的存储位置这样做。并且存储的位置可以由真实位置监听器异步更新。位置对象有提供数据的修复时间(请参阅getTime()方法),您可以使用它来确定是否仍应“预测”下一个标记移动或位置是否足够放弃并通知用户gps不知道它们在哪里:)