4

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

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

我正在像这样注册事件监听器(请记住,它在以前的 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

4 回答 4

4

这是已知问题:

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

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

不幸的是还没有解决方案。

于 2013-10-03T09:11:11.793 回答
1

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

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

并补充说:

long lastTime = 0;

...作为一个全局变量。

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

我在我的三星 Galaxy S3 上运行了上面的代码,网络提供商大约每 20 秒更新一次,所以代码看起来不错。

我还在 WiFi 上的 Samsung Dart(来自 T-mobile,但未激活)上运行此程序,网络提供商大约每 45 秒更新一次。

我还在 WiFi 上的三星 Nexus S 4G(来自 Sprint,但未激活)上运行此程序,网络提供商起初根本没有更新。重新启动设备似乎可以解决问题,现在它大约每 20 秒更新一次。

根据您的评论和我的经验,这个问题似乎在 OEM 之间甚至在同一 OEM 的设备型号之间有所不同。这可能是在 Android Jelly Bean 4.1 之前缺乏对 LocationListener 行为的严格执行的另一个怪癖。LocationListener 行为的严格执行最近才在 Android Jelly Bean 4.1 中开始,这在 Android 开发者文档中的第一个 requestLocationUpdates 方法签名中提到:

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

在 Jellybean 之前,minTime 参数只是一个提示,一些位置提供程序实现忽略了它。从 Jellybean 及以后,Android 兼容设备必须遵守 minTime 和 minDistance 参数。

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

必须重新启动设备以获取网络提供商位置可能是由于未从提供此位置信息的 Google 服务器获得响应。不知道为什么重新启动修复它。

于 2012-12-19T16:05:29.043 回答
1

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

奇怪的是,GPS_PROVIDER这不是必需的。

我希望这有帮助。

于 2014-10-29T14:15:33.127 回答
0

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

于 2012-12-20T06:02:19.337 回答