在没有互联网的情况下以编程方式更快地获取 GPS 坐标,但使用网络提供商和移动 GPS

Getting GPS co-ordinates quicker programmatically without internet, but using network provider and mobile GPS

我已经提到了很多关于这个主题的问题,但似乎缺少我的一些要求:

  1. 我想获得 ~0.0001 精度
  2. 的 GPS 位置
  3. 不想上网;虽然GSM/CDMA网络没问题
  4. 应在应用程序启动时以编程方式获取
  5. 应该会更快,比如在一分钟内(比如 iPhone,它可能也适用于飞行模式!)
  6. 该代码应该适用于大多数设备
  7. phone 可以switch-on/off 随时行驶任何距离

有什么办法只是满足上述要求的坐标吗?任何示例代码片段将不胜感激。

检查各种应用程序,例如 "Locate Me"、"Maverick",它们声称可以显示离线位置。但是在没有互联网的各种情况下,他们不提供跟踪位置(在印度)。
我已经提到了很多 old/new 个问题 inside/outside 所以。以下是一些:

[注意:我代表我的 Android 团队提出这个问题,如果需要,我很乐意澄清细节。如果你觉得这个post属于Android.Stackexchange,请移步。]

建议使用Google Location Services 它在当前时刻尽可能准确地获取尽可能准确的位置。它会自动(当然有配置)也采用最佳当前精度 - 任何可用的 GPS、网络、互联网、GSM/CDMA/LTE...你可以。

当然,您必须意识到每项服务都在自己的时间提供自己的准确性。例如,查看 Android 上的 GPS 测试应用,看看精度如何随着时间和使用的卫星而增加。

此外,定位服务对您也有好处,因为它只是提供坐标 - 正如您所要求的那样,并隐藏了很多工作来根据时间和准确性来确定要使用的真实服务。但是,当然,如果您的特定设备和位置上的 none 服务可以为您提供所需的准确性,那么就无法获得它。这就是服务还提供准确度测量的原因。

这是另一个link

1。我想获得 ~0.0001 精度的 GPS 位置

您可以只收听 GPS 提供商并在位置不符合您想要的最低准确度时丢弃该位置:

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 5, myLocationListener);  // "myLocationListener" must be an object from a class that implements LocationListener 

// "myLocationListener" implementation of LocationListener.onLocationChanged
public void onLocationChanged(Location location)
{    
    int MIN_ACCURACY = 5; // in metters
    if ((!location.hasAccuracy()) || (location.getAccuracy() > MIN_ACCURACY))
    {
        // discard this location and keep listening to new location readings
    }
    else
    {
        // that's a good reading!

        // do somethings you want... blah, blah, blah...

        // stop updates when you get the location to preserve users' battery.
        locationManager.removeUpdates(myLocationListener);
    }
}

2。不想上网;虽然GSM/CDMA网络没问题

是的,GPS 完全离线工作。 Android 只能利用互联网更新 A-GPS 数据缓存并在冷启动更新中提供更快的读取速度。


3。应在应用程序启动时以编程方式获取

然后在 mainActivity 的 onCreate 事件上调用项目 locationManager.requestLocationUpdates


4.应该更快,比如在一分钟内(比如 iPhone,这可能 也适用于飞行模式!)

请记住 iPhone 适用于 "high quality hardware"。 Android 在劣质设备上可能是 运行。所以这取决于:

  • 设备的硬件质量;
  • 当时天空中可见的卫星数量;
  • gps 缓存中年历和星历数据的年龄;
  • GPS 可能无法读取卫星,因为用户在建筑物内或其他地方。

5.该代码应该适用于大多数设备

最老的 Android 是什么 API 你想要它 运行?


6. phone 可以switch-on/off 随时移动任意距离

我没听懂。您对此有何顾虑?

-------------------------------------------- --------------------------------

更新一:

"...我想使用Android 4.0及以上..."

我测试了 Android 2.3 到 5.0 设备的 GPS 功能。所有 运行 都很好。

"...我观察到 1 个基于地理坐标的演示应用程序在其他设备上运行,但在我的 LGG3 上运行 Android 5.0. 有什么想法吗?..."

您是否检查了 Android 设置的 GPS 权限? (也许它被禁用)或者可能是硬件问题?您是否尝试过其他类似设备?

"...假设 GPS 显示纽约的正确位置, 我关掉 phone 然后在到达伦敦后打开, 那么它仍然会显示正确的位置(没有互联网)吗?..."

听起来你把事情弄糊涂了:读取 GPS 位置是一回事。在地图中显示该位置是另一回事!

您无需连接到互联网即可读取 GPS 位置。但是,如果您想在地图中显示该位置,您可能需要互联网(以加载地图资源等)。

如果您需要定期收集 GPS 位置(比方说,从 10 到 10 分钟),那么最好使用 AlarmManager 安排一个计时器,该计时器将 "finger" 您的应用并说 "hey, time to make a GPS reading!"。

"...还有你对最新的 Fused 有什么看法 API?..."

我测试过,用过一段时间,就放弃了。它需要安装 Google Play Services 才能工作(没问题,大多数用户的设备上都有)。但是如果你需要准确性(就像我一样),它就不会起作用。它使用 "fused sensors"(加速度计、gps、wifi、指南针等)尝试以尽可能小的功率获取用户位置。有时,它会说您距离实际位置有 10 英里。我无法将 "path" 保留在用户所在的位置。但是真的很省电。

在服务中使用 Android SDK.Implement 提供的融合位置 API 融合位置,并在您的应用程序 MainActivity 中调用它。