4

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

4

2 回答 2

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
    }

此外,您可以设置不同的采集频率。每 30 秒和每 2 分钟Gps提供一个新位置。Network

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

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

倒退

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

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

首选供应商

虽然Gps可能不是随处可用,但最精确的Network。在我的城镇,GPS 精度为 6 米,网络精度为 1 公里 :-(

两项服务

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

最后的笔记

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

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

大多数 Gps 接收器支持更新有关卫星位置的信息,从而缩短了定位时间。你可以GPS Satus从市场上使用,做到这一点。

问候。

于 2012-11-30T21:09:55.640 回答
3

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

关于你的问题:

如何确保始终获得位置?

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

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

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

这是一个已知的错误吗?

不,这不是错误。它更多是现有技术的已知限制。

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

这是可以尝试的。正如尼克已经说过的,这不应该是一个问题,但支票不应该受到伤害。

有针对这个的解决方法吗?:)

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

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

于 2012-11-28T10:54:53.990 回答