我有一个使用Google Maps和新的Fuse Location API的应用程序。当位置更改时,我使用以下代码获取更新:
locationClient.requestLocationUpdates(new LocationRequest(),
new LocationListener() {
@Override
public void onLocationChanged(Location location) {
//Some code
}
});
使用Android 4.3的Galaxy Nexus没问题。但是,在我的朋友使用Android 4.0.4的电话(Xperia ST21i)中,我无法收到这些更新。
我已经在Android文档和StackOVerflow的许多(如果不是全部)问题上看到使用
LocationRequest.create()
而不是new LocationRequest()
的问题。这个新代码仍然可以在我的手机上正常工作;我还没有在我朋友的电话上尝试过。阅读文档,我猜想
LocationRequest.create()
就像这样:public static LocationRequest create() {
LocationRequest locationRequest= new LocationRequest();
locationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
locationRequest.setFastestInterval(aNumber);
locationRequest.setInterval(anotherNumber);
return locationRequest;
}
这两段代码有什么区别,以及为什么它可以在我的手机上运行,但不能在我的朋友的手机上运行。在我朋友的手机上进行更改后,它可以工作吗?
如果没有,我还需要做些什么才能使其正常工作?
最佳答案
在许多4.0.x设备中实际上存在一个问题,如果您依赖网络级位置,则无法正确调用OnLocationChanged
。
您可能会在AOSP Issue Tracker看到问题报告
如此处所述,基本上网络级别的位置永远不会刷新,并且由于您使用的是LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY
,它将尽可能使用干扰最小的方法为您提供更新。我确实感到有些奇怪,如果该设备上还提供GPS和Wifi,那么您仍然永远也不会获得更新。
解决此问题的一种可能方法是将优先级更改为LocationRequest.PRIORITY_HIGH_ACCURACY
。如果您认为该解决方案会给您的用户带来麻烦,则可以执行一些操作,例如用LocationRequest
创建新的PRIORITY_HIGH_ACCURACY
并仅在第一种方法失败时才使用它。
特别是,我会在您首次发起位置请求时设置一个计时器,并在您的LocationListener
中使用一个标志来指示在该时间段内是否收到任何结果。如有必要,可以提供代码示例。