LocationRequest和LocationClient.requestLocationUpdates

时间:2013-11-27 18:25:36

标签: android google-maps location google-maps-android-api-2 google-play-services

我有一个使用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;
}

这两段代码有什么区别以及为什么它在我的手机上运行,​​但它不在我朋友的手机上。在我朋友的电话改变后它会起作用吗?

如果没有,我还需要做些什么才能让它发挥作用?

2 个答案:

答案 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)并不意味着该位置已知。但是,在打开我的应用之前,我仍然不知道为什么我的代码在告诉我的朋友打开Goog​​le地图应用并等到它开始显示当前位置之后无效。也许Google Maps App不会直接或间接使用或更新Google Fusion API的位置。

如果您想知道我是如何实现的,请点击以下链接: MapActivity

<强>更新 MapActivity