LocationManager.NETWORK_PROVIDER未在ICS中触发onLocationChanged

时间:2012-12-17 15:41:20

标签: networking location android-4.0-ice-cream-sandwich provider

是否有人知道事件监听器发生了什么,为WI-FI提供商更改了位置。我看到了很多关于此的问题,但没有正确答案。

我做得很好,它适用于较旧版本的android,但现在我将我的SAMSUNG GALAXY TAB 10.1更新为ICS,它不再工作了。也许这是他们在ICS中实现UI的SAMSUNG(或我的移动提供商)错误...

我正在注册这样的eventlistener(请记住,它在Android的流行版本中运行良好,我还在设置中启用了所有位置服务):

locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, loclistener); //refresh time and distance are to 0 so it should trigger location change event

在此请求之后,我检查了网络提供程序是否已启用,并且显示它是否正常。

代码:

if (locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
   Toast.makeText(this, "NETWORK PROVIDER enabled!", Toast.LENGTH_LONG).show();
   }

如果有人有想法,请帮助我......

4 个答案:

答案 0 :(得分:4)

这是已知问题:

设备重启后,网络位置提供商工作正常,但一段时间后它会停止更新。

https://code.google.com/p/android/issues/detail?id=57707

很遗憾没有解决方案。

答案 1 :(得分:1)

为了跟踪网络提供商的更新频率,我将onLocationChanged()方法修改为以下内容:

public void onLocationChanged(Location location) {      
    dummyText.setText(location.toString() + "\n" + "Elapsed Time (ms): " + (lastTime - location.getTime()));
    lastTime = location.getTime();
}

并补充道:

long lastTime = 0;

...作为全局变量。

这将打印更新之间的时间(以毫秒为单位)(第一次修复后 - 第一次修复只打印第一个位置的负时间值)。

我在Samsung Galaxy S3上运行了上述代码,网络提供商每20秒更新一次,所以代码似乎没问题。

我也在WiFi上运行三星Dart(来自T-mobile,但未激活),网络提供商每45秒更新一次。

我也在WiFi上使用三星Nexus S 4G(来自Sprint,但未激活),并且网络提供商起初根本没有更新。重启设备似乎解决了问题,现在大约每20秒更新一次。

根据您的评论和我的经验,看起来这个问题因OEM而不同,甚至在同一OEM的设备型号之间也存在差异。可能是Android Jelly Bean 4.1之前缺乏严格执行LocationListener行为的另一个怪癖。最近只在Android Jelly Bean 4.1中开始严格执行LocationListener行为,这是在第一个requestLocationUpdates方法签名下的Android开发人员文档中提到的:

http://developer.android.com/reference/android/location/LocationManager.html

  

在Jellybean之前,minTime参数只是一个提示,一些位置提供程序实现忽略了它。从Jellybean开始,Android兼容设备必须同时观察minTime和minDistance参数。

另外,根据我的经验,在更新的设备上,NETWORK_PROVIDER位置更新的刷新间隔在许多不同的设备上大约固定在20-30秒左右。因此,传递给locationManager.requestLocationUpdates()方法的minTime参数可能会被忽略。

重新启动设备以获取网络提供商位置可能是因为没有从提供此位置信息的Google服务器获得响应。不确定为什么重新启动修复它。

答案 2 :(得分:1)

NETWORK_PROVIDER我遇到了同样的问题。原因是当您请求更新时,NETWORK_PROVIDER不会为方法onLocationChanged()创建回调。您还需要致电getLastKnownLocation(NETWORK_PROVIDER),以便开始更新位置。

奇怪的是,对于GPS_PROVIDER,这不是必要的。

我希望这会有所帮助。

答案 3 :(得分:0)

确定。所以现在我开始工作了。真的很奇怪。我重新启动了所有设备,现在更新了。我不知道发生了什么,我真的想知道这种奇怪行为的原因是什么。感谢@barbeau所有的时间和帮助。