Android LocationListener从GPS切换到网络

Dag*_*agW 4 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);
Run Code Online (Sandbox Code Playgroud)

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

Lui*_*uis 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
    }
Run Code Online (Sandbox Code Playgroud)

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

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

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

倒退

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

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

优先提供者

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

两项服务

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

最后的笔记

确保您具有权限需求(ACCESS_FINE_LOCATION,INTERNET等).

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

大多数Gps接收器支持更新有关卫星位置的信息,从而缩短了修复时间.你可以GPS Satus在市场上使用它.

问候.