我有一个使用Google地图和新的Fuse Location API的应用。当位置发生变化时,我将此代码用于getUpdates:
locationClient.requestLocationUpdates(new LocationRequest(),
new LocationListener() {
@Override
public void onLocationChanged(Location location) {
//Some code
}
});
我在使用Android 4.3的Galaxy Nexus中没有任何问题。但是在我朋友的手机(Xperia ST21i)和Android 4.0.4中,我无法收到这些更新。
我已经在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;
}
这两段代码有什么区别以及为什么它在我的手机上运行,但它不在我朋友的手机上。在我朋友的电话改变后它会起作用吗?
如果没有,我还需要做些什么才能让它发挥作用?
答案 0 :(得分:2)
在许多4.0.x设备中实际存在一个问题,即如果您依赖网络级位置,OnLocationChanged
无法正常调用。
AOSP Issue Tracker处的问题报告可能就是您所看到的
如上所述,基本上网络级别的位置永远不会刷新,并且由于您使用的是LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY
,因此它会尝试使用最不突兀的方法在可能的情况下为您提供更新。我觉得有点奇怪的是,如果该设备上还有GPS和Wifi,你仍然无法获得更新。
解决此问题的一种可能方法是将优先级更改为LocationRequest.PRIORITY_HIGH_ACCURACY
。如果您认为该解决方案对您的用户造成麻烦,您可以执行以下操作:例如使用LocationRequest
创建新的PRIORITY_HIGH_ACCURACY
,并在第一种方法失败时使用它。
特别是,我会在您首次发起位置请求时设置一个计时器,并在LocationListener
中使用一个标志来指示是否在该时间范围内收到任何结果。如有必要,可以提供代码示例。
答案 1 :(得分:0)
我设法解决了我的问题。我忘了连接(onConnected)并不意味着该位置已知。但是,在打开我的应用之前,我仍然不知道为什么我的代码在告诉我的朋友打开Google地图应用并等到它开始显示当前位置之后无效。也许Google Maps App不会直接或间接使用或更新Google Fusion API的位置。
如果您想知道我是如何实现的,请点击以下链接: MapActivity
<强>更新强> MapActivity