Android LocationListener 从 GPS 切换到网络

标签 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 吗?
有针对这个的解决方法吗? :)

最佳答案

我同意 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)可能需要比请求更长的时间,因为与卫星同步并修复位置可能需要一些时间。

回退

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

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

首选供应商

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

两项服务

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

最后的笔记

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

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

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

问候。

关于Android LocationListener 从 GPS 切换到网络,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13509452/

相关文章:

android - 当使用带有 EditText 的 AlertDialog.Builder 时,软键盘不会弹出

android - 按钮 setOnClickListener 上的 NullPointerException

android - "the chosen operation is not currently available"

java - 我在制作查找用户纬度/经度和设备 IMEI 的应用程序时遇到问题

java - 持续跟踪用户的位置并绘制他所到之处的路径

Android horizo​​ntalscrollview 中心锁

android - 如何在自定义 View 的 Canvas 中设置位图图像?

android - 谁在 Android 的 LocationManager 中触发 onLocationChanged?

发送模拟位置时 Android 模拟器重新启动

android - 删除与 android.location 方法相关的 @Override 注解