【问题标题】:trying to get the most accurate device location from GPS or Network in Android尝试从 Android 中的 GPS 或网络获取最准确的设备位置
【发布时间】:2010-03-11 21:14:20
【问题描述】:

我正在尝试在尽可能短的时间内确定设备的最准确位置。

我将数据存储为地理点,并将其显示在地图视图上。

上次我在设备上激活 GPS 并让它获得位置锁定时,我距离现在的位置大约 80 英里。

我有一个位置管理器设置和一个位置监听器。

如果我这样做,我会得到 NULL。

  myLocOverlay = new MyLocationOverlay(this, mapView);
  GeoPoint test = myLocOverlay.getMyLocation();

但在接下来的几行中;

  myLocOverlay.enableMyLocation();      
  mapView.getOverlays().add(myLocOverlay);

这样,地图上的叠加层会显示当前位置。它正在使用网络提供商,但也在尝试获取 GPS 定位(它不能,因为我在室内并且没有靠近顶层的地方)。

如果我这样构建地理点;

    if(lm.getLastKnownLocation("gps") != null) 
    {
     test = new GeoPoint(
        (int) (lm.getLastKnownLocation("gps").getLatitude() * 1E6), 
        (int) (lm.getLastKnownLocation("gps").getLongitude() * 1E6));
    }

    else
    {

    if(lm.getLastKnownLocation("network") != null) 
    {
     test = new GeoPoint(
       (int) (lm.getLastKnownLocation("network").getLatitude() * 1E6), 
       (int) (lm.getLastKnownLocation("network").getLongitude() * 1E6));
    }
    //bad things
    }

然后我得到令人困惑的结果。如果我禁用设备 GPS 提供程序,则代码将移至网络提供程序并给我一个相当准确的结果。如果我启用 GPS 提供程序,那么地理点会作为我允许设备获得 GPS 锁定的最后一个位置返回。

我想避免上面的结果,所以正在考虑使用;

GeoPoint test = myLocOverlay.getMyLocation();

但正如我上面所说,我只是从中得到 NULL。

没有从 GPS 和网络获取地理点,然后比较它们,如果它是说 1 英里以外的网络位置,则忽略 GPS 结果 - 我有点卡住了。为什么 getMyLocation() 不起作用,不应该返回 myLocOverlay 在地图视图上显示的 GeoPoint?

【问题讨论】:

  • 请注意,您也可以致电Location.getTime() 来查看何时发现“最后已知”位置。

标签: android gps location android-mapview overlays


【解决方案1】:

它可能会返回 null,因为它尚未获得修复。您应该注册一个LocationListener,它接受来自网络和 GPS 来源的更新。然后,当您获得位置更新时,您可以查看位置的准确性并决定是否要使用它。

【讨论】:

  • 这是我想要的初始值,但我希望地图视图显示大致正确的图块。如果我们忽略获取任何位置更新,只需查看已经存在的内容。我可以从提供商那里获取两个不同的位置,一个来自 GPS,另一个来自网络。我想要一种获得两者中最新的方法。这就是我认为 getMyLocation() 会做的事情。
  • “看看已经有什么”——如果是null,那么“已经有”什么都没有。
  • 但是为什么 lm.getLastKnownLocation("gps").getLatitude() 返回一个值。
  • 它会根据 GPS 芯片组的工作方式返回一个值。 GPS 芯片组必须以不同的方式来获取修复、热修复和冷修复。 hot0fix 是它获取它知道的最后一个位置并开始尝试查询应该在该区域的卫星。如果您没有移动太远,它会找到它们并能够快速修复。如果热修复失败,它将进入冷修复,开始尝试查询所有存在的卫星,直到找到一些可以回复的卫星。
  • 它总是先尝试一个热修复,因为它要快很多,所以它必须存储最后一个已知位置,即使它确实很远。
【解决方案2】:

我猜你对地理点的要求太快了。 MyLocationOverlay 将使用自己的侦听器来检索修复。也许它要求 gps 修复,看看它有多旧,然后如果它太旧,获取网络修复并在等待 gps 修复时使用它。

这意味着在后台与 gps 芯片组和 gsm 调制解调器以及网络后端通话。
在您的程序需要进入下一行时,这是不可能的。

在 UI 中,它看起来非常即时,但这是用人眼测量的。

您可以使用 CaseyB 的答案并在两个提供商上注册您自己的 gps 侦听器,然后自己决定要使用哪个坐标。如果您想这样做,可以使用一些方法来获取上次修复的时间 (Location.getTime()) 和位置的准确性。

第二种可能性是稍等片刻,看看调用是否仍然返回 null,如果是,则再等一会儿。

【讨论】:

  • 谢谢。我认为最好的选择是继续检查调用,直到它返回一个值。我确实开始编写一些逻辑来“选择”最佳位置修复 - 但如果代码已经存在并且运行良好,那么使用它是有意义的。我很好奇如何获得最后一次修复的时间 - 我还没有在文档中找到它(但知道准确性)。
  • 我将此添加到我的答案中,它是 loctaion.getTime()
猜你喜欢
  • 1970-01-01
  • 2012-09-11
  • 1970-01-01
  • 2016-07-14
  • 1970-01-01
  • 1970-01-01
  • 2018-06-30
  • 2011-02-04
  • 1970-01-01
相关资源
最近更新 更多