当提供者是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 ”。 在这种情况下,返回的位置为null。

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

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/可以帮助您理解原因。

移动设备连接到某些卫星需要几秒钟。 只要手机没有连接,因为尚未建立连接,该位置将为空。

您还必须从GPS提供商处请求位置更新。

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

我认为问题在于GPS在同步中排在第二位。 你必须使用一个线程。 举个例子:

 @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); } } 

// …
}