试图从Android中的GPS或网络获取最准确的设备位置

时间:2010-03-11 21:14:21

标签: android gps location android-mapview overlays

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

我将数据存储为地理位置,并将其显示在地图视图中。

我最后一次在设备上激活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在mapview上显示的GeoPoint吗?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

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

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

在用户界面中它会看起来非常瞬间,但用人眼测量。

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

第二种可能性是等待一点,看看如果调用仍然返回null,那么再等一会儿。