安卓定位管理器(LocationManager)的getLastKnownLocation()方法返回null

17

我正在尝试在应用程序中仅对GPS坐标进行一次采样。 我不想创建LocationListener对象以不断获取GPS更新。 我想等到接收到坐标,然后继续执行另一个任务。

这是代码片段:

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变量始终为null。我尝试使用命令“geo fix latitude longitude”进行设置,也尝试使用DDMS的方式进行设置。但这两种方法都没有对代码产生任何影响。此外,这段代码也没有引发任何异常。

感谢您的帮助。


1
这里有一个不错的示例,包含源代码http://marakana.com/forums/android/android_examples/42.html。 - Fedor
2个回答

12

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

一个可能的检查是查看设置是否禁用了GPS提供程序?然后发送地理位置修复。

然而,在您的情况下,我建议使用Location Listener,因为您需要一个地理位置修复来继续进行。Location Listener用于从LocationManager接收位置更改通知。您可以在第一次获取地理位置修复后取消注册侦听器。

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


是的,编写一个LocationListener并等待直到你满意为止,这几乎是你唯一的选择。正如提到的那样,你可以立即注销它。 - Jeremy Logan
8
事实证明,如果没有任何LocationListener,它将无法工作。即使只添加一个不执行任何操作的模拟LocationListener也会导致手机获取GPS坐标。 - Robert Parker
我假设LocationListener会更新一些缓存位置,locationManager会使用它们。感谢您的发布。 - krishc
你也可以使用广播接收器,并通过PendingIntent请求更新。 - Necronet
5
如果这种方法叫做“最后已知位置”,为什么不能返回最后已知的位置,而要等待新的修复呢?对我来说,这似乎非常不划算。 - Andrew S

0

尝试使用MyLocationOverlay,创建一个可运行的程序,以处理GPS位置,并将其传递给

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

然后禁用MyLocationOverlay的位置更新。

编辑:位置为空的原因是在运行该代码时尚未收到地理固定。


我也遇到了空值问题,但 Google 地图应用程序可以立即知道我的位置,因此一定有某种修复方法被储存在某个地方。 - Andrew S
使用可运行的代码是聪明的,但是对于这个问题没有必要引入Google Maps API。 - Dorje

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接