Android LocationListener从GPS切换到网络

时间:2012-11-22 09:27:48

标签: android location

我有一个服务实现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吗? 这个问题有方法解决吗? :)

2 个答案:

答案 0 :(得分:7)

我同意AlexBottoni的大部分评论,虽然在某些方面我无法支持他。

<强>概述

首先,只是检查你做得对吗......

您为两个提供商设置了相同的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秒提供一个新位置,每2分钟提供一次Network

由于您没有施加最小距离,因此您应该从每个提供商处收到一个新的Location(只要他们可以获得修复)并且要求的频率。如果您没有收到修复,是因为他们无法获得修复。

此外,它可能需要一些时间来获得修复(主要是使用Gps),因为可能需要一些时间来与卫星进行shyncronize并修复位置。

<强>后备

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

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

优惠提供商

虽然Gps可能无处可用,但最精确的是Network。在我的城镇,我通过GPS获得6米精度,使用网络获得1公里: - (

两项服务

无论您在哪里注册监听器,活动或服务,将它们分开,只要您提出请求并且提供商可以获得修复,您将获得该位置(假设应用程序中没有错误:-))

最终笔记

确保您有权限(ACCESS_FINE_LOCATION,INTERNET等)。

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

大多数Gps接收器支持更新有关卫星位置的信息,从而缩短了修复时间。您可以使用市场上的GPS Satus进行操作。

问候。

答案 1 :(得分:3)

这真的很奇怪,因为AFAIK,Android只有在第一个选项(GPS)不起作用时才会回到第二选择(网络位置提供商)。这两个位置提供者是独立的,应该相互独立地向您的听众发送位置更新。因此,第一个(GPS)在任何情况下都不应该阻止第二个(网络)。

关于你的问题:

如何确保我总能找到位置?

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

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

你也不能。这取决于可用的网络。无论如何,您可以检查代码中的位置提供程序获得的内容,并从一个切换到下一个,直到获得可用的位置修复。

这是一个已知的错误吗?

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

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

这是值得尝试的。正如尼克已经说过,这不应该是一个问题,但检查不应该受到伤害。

有解决方案吗? :)

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

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