【问题标题】:Android LocationListener Switching from GPS to NetworkAndroid LocationListener 从 GPS 切换到网络
【发布时间】:2012-11-22 09:27:47
【问题描述】:

我有一个服务实现 LocationListener 监听 GPS 和网络。

该应用程序依赖于持续的位置反馈,但似乎当 GPS 难以获取 locationfix 网络位置时介入。

manager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000 * 30,0, LocationReporterService.this);
manager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000 * 60 * 2,0, LocationReporterService.this);

问题
如何确保始终获得位置信息?
如何确保如果我没有获得 GPS 位置,我会获得网络位置?
这是一个已知的错误吗?
我应该有 2 个服务,GPSLocationService 和 NetworkLocationsService?
这个问题有方法解决吗? :)

【问题讨论】:

  • 它不需要为网络和gps创建两个服务。你可以在同一个服务类中做到这一点
  • 如果您不请求 GPSProvider 更新,您会获得 NetworkProvider 更新吗?另外,您在哪些设备上进行测试?
  • 嗨!是的,如果我只请求网络更新,我确实会获得 NetworkProvider 位置。似乎Android系统的困难在于它有几颗卫星。获得GPS位置的卫星太少,而获得网络位置的卫星太多?我有一系列不同的设备,例如 Nexus S (2.3/4.1)、HTC One X、Galaxy Note 等。这个问题在 Android 4.0.4 及更高版本的较新版本中更常见。

标签: android location


【解决方案1】:

我同意 AlexBottoni 的大多数 cmets 的好回答,尽管在某些方面我不能支持他。

概述

首先,只是为了检查你是否做对了……

您为两个提供商设置了相同的LocationListener。要确定您接收位置的位置,您需要像这样对其进行测试:

public void onLocationChanged(Location fix) {
    if(fix.getProvider().equals(LocationManager.GPS_PROVIDER)){
        //here Gps
    } else if(fix.getProvider().equals(LocationManager.NETWORK_PROVIDER)){
        //here Network
    }

另外,您设置了不同的采集频率。 Gps 每 30 秒提供一个新位置,Network 每 2 分钟提供一次。

由于您没有规定最小距离,您应该从每个供应商处收到一个新的Location(只要他们能得到修复),并按照要求的频率。如果您没有收到修复,是因为他们无法获得修复。

此外,获得修复(主要是使用 Gps)可能需要更长的时间,因为可能需要一些时间来与卫星同步并修复位置。

后备

没有从一个提供者到另一个提供者的内置回退。正如亚历克斯所说,他们是独立的。我正在使用以下方法来实现回退:

  • 注册 Gps 监听器并启动计时器
  • 在每个 GPS 位置上,重新启动计时器
  • 如果定时器结束,注册网络监听(Gps监听保持注册)
  • 如果新的 Gps 位置到达,请取消注册网络侦听器,重新启动计时器

首选供应商

虽然Gps 可能并非在所有地方都可用,但比Network 更精确。在我的镇上,GPS 精度为 6 米,网络精度为 1 公里:-(

两种服务

不管你在哪里注册监听器、活动或服务,分开 ot 一起,只要你请求它们并且提供者可以得到修复,你就会得到位置(假设应用程序中没有错误:-))

最后说明

确保您拥有所需的权限(ACCESS_FINE_LOCATION、INTERNET 等)。

确保手机设置启用了网络位置(通常默认为禁用)

大多数 Gps 接收器支持更新有关卫星位置的信息,从而缩短定位时间。您可以使用市场上的GPS Satus 来实现。

问候。

【讨论】:

  • Grate 回答我想说的是添加以检查会破坏一切的模拟位置。
  • 谢谢,我现在用定时器来注销和注册!它以某种方式更好地工作..
【解决方案2】:

这真的很奇怪,因为据我所知,只有当第一个选择(GPS)不起作用时,Android 才会退回到第二个选择(网络位置提供程序)。这两个位置提供者是独立的,应该彼此独立地向您的听众发送位置更新。因此,第一个(GPS)在任何情况下都不能阻挡第二个(网络)。

关于您的问题:

我如何确保我总能获得位置信息?

你没有。没有办法确定。在某些情况下,您无法获得任何位置修复,因为没有可用的位置参考。地铁/地铁站经常出现这种情况。没有 GPS,没有蜂窝天线(不是每个人都住在纽约或伦敦……),没有 Wi-Fi 热点,因此无法确定您当前的位置。信不信由你,在我镇的新医院里,我们目前遇到这种情况,因为 GPS 星座不可见(室内......),还没有安装 wi-fi 热点,唯一可用的 CellID 天线只是几百米外,因此无论在建筑物内外,您都可以在任何地方获得相同的信号。

如何确保如果我没有获得 GPS 位置,我会获得网络位置?

你也不能。这取决于可用的网络。无论如何,您可以在代码中检查从位置提供者那里获得的信息,然后从一个切换到另一个,直到获得可用的位置修复。

这是一个已知的错误吗?

不,这不是错误。这是现有技术的一个已知限制。

我应该有 2 个服务,GPSLocationService 和 NetworkLocationsService 吗?

这是值得尝试的。正如 nick 已经说过的,这不应该是一个问题,但检查应该不会造成伤害。

有解决办法吗? :)

如果您的应用主要用于城市环境(城镇),您很可能应该使用网络定位引擎作为主要定位引擎。如今,每个村庄和城镇都被大量的手机天线和大量的 Wi-Fi 热点所覆盖,因此您更有可能从网络位置提供商那里获得比 GPS 定位器更好的定位。在高楼和狭窄道路的城镇中尤其如此(这不仅意味着纽约市。即使在威尼斯,我们的 GPS 也存在问题)。网络引擎在获得第一次修复时也更快,并且在室内也能正常工作。

仅当网络定位引擎不起作用时才回退到 GPS。

【讨论】:

  • 感谢您的回答,由于计时器建议,我将赏金奖励给了另一个答案
  • 没问题。这是完全公平的:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-27
  • 1970-01-01
  • 2012-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多