Android定位监听器:从GPS切换到网络

4

我有一个实现了LocationListener接口的服务,可以同时监听GPS和网络。

该应用程序依赖于持续的位置信息,但是当GPS难以获取位置修复时,网络位置并不能代替。

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

问题
如何确保我总能获取到位置信息?
如果我无法获取GPS位置,如何确保我可以获得网络位置?
这是一个已知的错误吗?
我应该有两个服务,GPSLocationService和NetworkLocationsService吗?
有解决方案吗? :)


你不需要为网络和GPS创建两个服务,可以在同一个服务类中完成。 - Narendra Pal
如果您没有请求GPSProvider更新,您是否会收到NetworkProvider更新?此外,您正在测试哪些设备? - Sean Barbeau
嗨!是的,如果我只请求网络更新,我确实可以获得NetworkProvider位置。似乎对于Android系统来说,当其拥有一些卫星时会更加困难……太少以至于无法获取GPS位置,但太多以至于无法获取网络位置?我有各种不同的设备,例如Nexus S(2.3 / 4.1),HTC One X,Galaxy Note等。该问题在较新版本的Android中更经常发生,即4.0.4及以上版本。 - DagW
可能重复: http://stackoverflow.com/questions/4455802/android-if-both-gps-network-are-requested-at-the-same-time-network-provider?rq=1 - DagW
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
    }

此外,您可以设置不同的获取频率。Gps每30秒提供一个新位置,Network则每2分钟提供一次。
由于您没有设置最小距离,只要两者(只要能够获得定位),就应该从提供者中收到一个新的Location。如果未获得定位,则是因为它们无法获取定位。
此外,可能需要比请求的时间稍长才能获得定位(主要是与GPS相关),因为它可能需要一些时间来与卫星同步并确定位置。
回退
没有内置的提供程序回退。如Alex所说,它们是独立的。我使用以下方法实现备用:
- 注册Gps侦听器并启动计时器 - 在每个GPS位置上,重新启动计时器 - 如果计时器到达结束,请注册Network侦听器(Gps侦听器保持注册状态) - 如果有新的Gps位置到达,请取消注册Network侦听器,重新启动计时器
首选提供程序
尽管Gps可能无处不在,但比Network精度更高。在我的城镇中,我使用GPS获得6米的精度,而使用Network获得1千米的精度 :-(
两项服务
无论您将侦听器、活动或服务注册在哪里,分开或一起,只要您请求它们且提供程序可以获取定位,您就会获得位置(假设应用程序没有错误)。
最后注意事项
确保您拥有所需的权限(ACCESS_FINE_LOCATION、INTERNET等)。
确保手机设置启用了网络定位(通常默认情况下是禁用的)。
大多数GPS接收器支持更新卫星位置信息,以改善定位时间。您可以在市场上使用GPS状态来执行此操作。
祝好。

很好的回答,我只想说要添加检查模拟位置的代码,否则会破坏一切。 - ransom bot
谢谢,我现在使用一个计时器来注销和注册!不知何故它的效果更好了。 - DagW

3
这真的很奇怪,因为据我所知,Android不会只在第一个选择(GPS)无法使用时才退而求其次(网络位置提供商)。这两种定位提供者是独立的,应该独立地向您的监听器发送位置更新。因此,第一个选择(GPS)在任何情况下都不应该能够阻止第二个选择(网络)。
关于您的问题:
如何确保我始终获得位置?
你不能。没有办法确保。有些情况下,您可能无法获取任何位置参考,因为没有可用的位置参考。这在地铁/地下车站中经常发生。没有GPS、没有手机信号(并非每个人都住在纽约或伦敦...)、没有Wi-Fi热点,因此无法确定您当前的位置。信不信由你,在我们城镇的新医院,目前就出现了这种情况,因为GPS卫星不可见(室内...),还没有安装Wi-Fi热点,唯一可用的CellID天线距离建筑物只有几百米,所以你无论在室内还是室外都会收到相同的信号。
如何确保如果我不能获得GPS位置,我会获得网络位置?
你不能。这取决于可用的网络。不管怎样,你可以在你的代码中检查你从位置提供者那里得到了什么,并在一个到另一个的转换中切换,直到你获得一个可用的位置修复。
这是一个已知的Bug吗?
不,这不是Bug。这更像是现有技术的已知限制。
我应该有2个服务,GPSLocationService和NetworkLocationsService吗?
这是值得尝试的。正如Nick已经说过的,这不应该是一个问题,但检查不会有害。
有解决办法吗? :)
如果您的应用主要在城市环境(城镇)中使用,最好将网络位置引擎作为您的主要定位引擎。现在,每个村庄和城镇都覆盖了大量的手机信号天线和大量的Wi-Fi热点,因此您更有可能从网络位置提供商那里获得良好的位置修复,而不是从GPS提供商那里。这在高层建筑和狭窄道路的城镇中特别正确(这并不仅仅意味着纽约。即使在威尼斯,我们也有GPS问题)。网络引擎在获取第一个修复位置时也更快,并且在室内也可以工作。
只有在网络位置引擎不能工作时才回退到GPS。

谢谢您的回答,我将赏金奖励给了另一个答案,因为它提供了计时器建议。 - DagW
没问题。这是完全公平的 :-) - AlexBottoni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接