2011-04-15 105 views
3

我想找回我的当前位置坐标,下面的代码段提供者是gps时返回的位置是否为空?

LocationManager locationManager= (LocationManager) getSystemService(context); 

Criteria criteria = new Criteria(); 
criteria.setAccuracy(Criteria.ACCURACY_FINE); 
criteria.setAltitudeRequired(false); 
criteria.setBearingRequired(false); 
criteria.setCostAllowed(true); 
criteria.setPowerRequirement(Criteria.POWER_LOW); 

provider = locationManager.getBestProvider(criteria, true); 
Location location = locationManager.getLastKnownLocation(provider); 

我得到当供应商为“网络”的位置坐标。

当我改变位置和安全选项的设置,使“使用GPS卫星”选项提供者更改为“GPS”。 在这种情况下,返回的位置为空。

这可能是什么原因以及如何纠正?

回答

4

GPS提供商需要一段时间才能获得修复,特别是如果以前没有进行修复的话。 getLastKnownLocation不是一个阻塞呼叫,它将等待直到建立一个实际的实时GPS定位(该定位可能需要1分钟,取决于各种原因)。

此外,请确保你在外面,原因很明显)。

而不是简单地调用GPS提供者的getLastKnownLocation,你首先需要从它请求位置更新。

下面的文章解释了原理非常好:http://developer.android.com/guide/topics/location/obtaining-user-location.html

这是一个必须阅读的人做与Android上的位置提供什么。

的典型流程是:

  1. 开始应用。
  2. 开始收听所需位置提供商的更新。
  3. 通过筛选出新的但不太准确的修正来维护“当前最佳估计位置”。
  4. 停止侦听位置更新。
  5. 利用最后的最佳位置估算值。

查看下面的代码,我们正在初始化一个MyLocationListener(用于跟踪手机的位置),并检索对LocationManager的引用。我们正在从位置管理器请求位置更新。我们使用10米的minDistance(通知的最短距离间隔)和35秒的minTime(通知的最短时间间隔)。

LocationListener locationListener = new MyLocationListener(); 
LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 35000, 10, this.locationListener); 

在实现这一点,你可能会注意到MyLocationListener接收更多的更新,那么你希望(鉴于minTime和minDistance才会参数)。以下文章http://blog.doityourselfandroid.com/2010/12/25/understanding-locationlistener-android/可以帮助您理解原因。

+0

感谢您对detail.good答案解释。 – rogerstone 2011-04-15 10:51:50

+0

是的,我试过这样,它工作正常,当我关掉我的设备,再次打开并运行应用程序,它再次给我同样的问题 – user1891910 2013-01-21 11:00:24

2

需要几秒钟,直到移动连接到一些卫星。只要手机没有连接,由于连接尚未建立,位置将为空。

您也必须向GPS提供商申请位置更新。

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener); 
+0

Thanks.I现在已经得到它 – rogerstone 2011-04-15 10:51:16

2

我认为问题在于,GPS需要第二个syncronice。你必须使用一个线程。就拿这个例子:

@Override 
public void run() { 

    mLocationManager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE); 

    if (mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { 
     Looper.prepare(); 
     mToast.Make(getContext(),"GPS",0); 
     mLocationListener = new MyLocationListener(); 
     mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mLocationListener); 
     Looper.loop(); 
     Looper.myLooper().quit(); 

    } else if (mLocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)){ 
     Looper.prepare(); 
     mToast.Make(getContext(),"Triangulacion",0); 
     mLocationListener = new MyLocationListener(); 
     mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, mLocationListener); 
     Looper.loop(); 
     Looper.myLooper().quit(); 
    }else{ 
     mToast.Make(context,"No se encuentra señal se procede a mandar un mensaje normal",0); 
     Looper.prepare(); 
     handlerNormal.sendEmptyMessage(0); 
     Looper.loop(); 
     Looper.myLooper().quit(); 
    } 

} 

和位置监听器

private class MyLocationListener implements LocationListener 
{ 
    @Override 
    public void onLocationChanged(Location loc) { 
     if (loc != null) { 
      setCurrentLocation(loc); 
      handler.sendEmptyMessage(0); 
     } 
    } 

// ...
}

相关问题