【问题标题】:Android LocationManager.getLastKnownLocation() returns nullAndroid LocationManager.getLastKnownLocation() 返回 null
【发布时间】:2009-10-22 17:07:44
【问题描述】:

所以我试图在应用程序中只对 gps 坐标进行一次采样。我不想创建一个 LocationListener 对象来不断获取 gps 更新。我想等到收到坐标后,再继续执行其他任务。

这是一个代码sn-p

LocationManager lm = (LocationManager)act.getSystemService(Context.LOCATION_SERVICE);
Criteria crit = new Criteria();
crit.setAccuracy(Criteria.ACCURACY_FINE);
String provider = lm.getBestProvider(crit, true);
Location loc = lm.getLastKnownLocation(provider);

loc 变量在模拟器中始终为空。我尝试使用命令“geo fix latitude longitude”来设置它,我也尝试使用 DDMS 方式来设置它。这两种方法都对代码没有任何影响。 sn-p 也不会导致任何异常。

感谢您的帮助。

【问题讨论】:

标签: android gps


【解决方案1】:

请求更新位置的调用没有阻塞,因此它不会在那里等待。此外,模拟器中的提供程序可能尚未启动。

可能的检查可能是查看其中的设置是否禁用 gps 提供程序?然后发送地理修复。

但是,我会使用位置侦听器,这在您的情况下是理想的,因为您需要地理修复才能继续进行。位置侦听器用于在位置更改时接收来自 LocationManager 的通知。您可以在第一次 geofix 后取消注册监听器。

注意:在设备上获取当前位置可能需要一些时间,即使在设备上这也可能返回 null。

【讨论】:

  • 是的,做一个 LocationListener 然后等到你有一个你满意的修复是你唯一的选择。如前所述,您可以立即取消注册。
  • 事实证明,没有任何 LocationListener 它将无法工作。即使只是添加一个不做任何事情的模拟 LocationListener 也会导致手机获取 gps 坐标。
  • 我假设 LocationListener 更新了 locationManager 使用的一些缓存位置。感谢发帖。
  • 您还可以针对拥有广播接收器并使用 PendingIntent 请求更新
  • 因此,如果该方法被称为最后一个已知位置,为什么它不能返回最后一个已知位置而不是等待新的修复。对我来说似乎很适得其反。
【解决方案2】:

尝试使用 MyLocationOverlay ,创建一个可运行的对象来执行您需要对该 GPS 位置执行的操作,并将其传递给

boolean     runOnFirstFix(java.lang.Runnable runnable)
          Queues a runnable to be executed as soon as we have a location fix.

然后禁用 MyLocationOverlay 的位置更新。

编辑:位置为空的原因是因为在运行代码时,没有收到任何 geofix。

【讨论】:

  • 我也得到了一个空值,但谷歌地图应用程序立即知道我在哪里,所以一定有一些修复程序存储在某个地方。
  • 使用 runnable 很聪明,但没有必要为这个问题引入 google maps api。
猜你喜欢
  • 2014-07-17
  • 1970-01-01
  • 1970-01-01
  • 2012-08-19
  • 1970-01-01
  • 1970-01-01
  • 2012-06-22
  • 2012-05-28
相关资源
最近更新 更多