在没有互联网的情况下以编程方式更快地获取 GPS 坐标,但使用网络提供商和移动 GPS
Getting GPS co-ordinates quicker programmatically without internet, but using network provider and mobile GPS
我已经提到了很多关于这个主题的问题,但似乎缺少我的一些要求:
- 我想获得
~0.0001
精度 的 GPS 位置
- 不想上网;虽然GSM/CDMA网络没问题
- 应在应用程序启动时以编程方式获取
- 应该会更快,比如在一分钟内(比如 iPhone,它可能也适用于飞行模式!)
- 该代码应该适用于大多数设备
- 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 中调用它。
我已经提到了很多关于这个主题的问题,但似乎缺少我的一些要求:
- 我想获得
~0.0001
精度 的 GPS 位置
- 不想上网;虽然GSM/CDMA网络没问题
- 应在应用程序启动时以编程方式获取
- 应该会更快,比如在一分钟内(比如 iPhone,它可能也适用于飞行模式!)
- 该代码应该适用于大多数设备
- 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 中调用它。