Fused Location Provider 是不错的选择吗?
Posted
技术标签:
【中文标题】Fused Location Provider 是不错的选择吗?【英文标题】:Is Fused Location Provider good choice? 【发布时间】:2016-10-30 14:11:02 【问题描述】:我正在开发一个我想使用 Fused Location Provider 的应用程序。但我有一些疑问,还有几个问题。
-
当 GPS 关闭并且我将优先级设置为 HIGH 时,这是否意味着 GPS 会自动开启?
我可以根据需要将 UpdateLocation 设置为具有高优先级的 Fused 提供程序以至少节省一点电量吗?
我如何知道 Fused 提供商正在使用什么(是 GPS 还是网络提供商)?
最后
Fused provider 真的是安卓定位的最佳选择吗?有什么不好的地方吗?
你的意见是什么? 提前致谢。
【问题讨论】:
是的,FusedLocationApi 最适合 android,它包括改进的位置更新,具有高精度和省电功能。检查此以获取更多详细信息 - developers.google.com/android/reference/com/google/android/gms/… 这可能是最好的,但这没有任何意义。它仍然很糟糕,因为谷歌没有人关心 WLAN 路由器的位置变化,这可能导致位置与真实位置相距数千公里,而且即使 GPS 具有正确的值,谷歌似乎更喜欢 WLAN 位置...... 【参考方案1】:当 GPS 关闭并且我将优先级设置为 HIGH 时,这是否意味着 GPS 会自动开启?
不,它不会自动开启。但是,如果您使用 SettingsApi,则会向用户提示一个对话框,并提供必须打开 GPS 的信息。如果用户接受它,gps 将自动激活。检查SettingsApi
我如何知道 Fused 提供商正在使用什么(是 GPS 还是网络提供商)
如果您正确使用融合提供程序 api 和 SettingsApi。它将为当前位置请求进行足够的所需设置。
Fused provider 真的是安卓定位的最佳选择吗?有什么不好的地方吗?
在我看来,在融合供应商之前,您必须直接与供应商(Gps、网络)打交道,但融合只是问您,“您想接收多准确的位置?”
【讨论】:
"如果您正确使用融合的提供者 api 和 SettingsApi。它将为当前位置请求提供足够的所需设置。"不是问题的答案。我真的很讨厌它不知道 fused provider 从哪里得到它的位置。我学到了很难相信准确度值的方法。如果位置不是来自 GPS 或 GSM,那么准确性完全没有意义。 是的,我知道,建议使用“设置 API”不是答案。但是,我们应该对位置的准确程度感兴趣,而不是在使用融合位置提供程序时使用/使用它们中的哪一个(GPS、NETWORK)。因此,Settings Api 将保证您的位置请求的优先级。顺便说一句,到目前为止,我通过PRIORITY_HIGH_ACCURACY
和适当的设置从融合提供商那里收到了高精度的位置。【参考方案2】:
正如https://developer.android.com/training/location/index.html 在这里非常明确地指出,Google Play 服务位置 API 优于 Android 框架位置 API (android.location) 作为向您的应用添加位置感知的一种方式。如果您当前正在使用 Android 框架位置 API,强烈建议您尽快切换到 Google Play 服务位置 API。所以我希望你得到你的答案。
【讨论】:
那么,这意味着 Fused 提供商真的是最好的吗? :) 是的。至少 Android 官方文档是这么说的。而且我认为没有理由不使用 Fused API。 再问一个问题...当我使用 HIGH 优先级并且在文档中写道该间隔约为 5 秒..这是否意味着每 5 秒位置正在更新或者这意味着我们必须等待5 秒钟以获取我们的位置? 当我们为位置请求对象设置间隔时,这意味着我们将每 5 秒更新一次新位置。如果 FusedApi 有其他应用程序的位置更新,它甚至可以在间隔之前为您提供更新。为了最小化 API setFasInetrval(long miliseconds)。 如果用户在中国,并且手机上没有安装google play服务,那么fusedLocation根本无法工作,对吧?【参考方案3】:我为 Gps、Wifi 和 Fused Location Provider 制作了一个测试应用程序并测试了 2 天。它更好,因为它同时使用了它们,而且大多数时候它是最准确的一个。此外,Gps 数据是一个非常嘈杂的数据,会导致抖动,解决此低通滤波器或使用其他滤波器。用于获得最准确结果的最成功的滤波器之一是卡尔曼滤波器。 FusedLocationProvider 使用这个过滤器,就像 RotationVector 一样,它是一个融合了硬件和软件的传感器。 RotationVector 使用加速度计、陀螺仪(如果有)和磁场传感器来获取和过滤位置和方位角数据。
Location.getProvider for Gps with LocationManager 返回“gps”,Wifi 返回“network”,FusedLocationProvider 返回“fused”。
当 GPS 关闭并且我将优先级设置为 HIGH 时,这是否意味着 GPS 将自动开启,或者不自动开启
如果可用,除“电池节省”之外的任何其他操作都会打开 Gps。此设置在我的 Android 7.1.1 手机上可用。用户端的位置设置在以前版本的 Android 上有所不同。作为开发者启用 Gps 你应该设置mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
PRIORITY_HIGH_ACCURACY - 使用此设置请求最精确的位置。使用此设置,定位服务更有可能使用 GPS 来确定位置。
设置优先级也决定了电池使用水平。
我可以根据需要将 UpdateLocation 设置为具有高优先级的 Fused 提供程序以至少节省一点电池吗?
是的,除了优先级之外,您还可以设置位置请求的间隔。
mLocationRequest.setInterval(UPDATE_INTERVAL_IN_MILLISECONDS);
mLocationRequest.setFastestInterval(FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS);
我如何知道 Fused 提供商正在使用什么(是 GPS 还是网络提供商)?
Location.hasSpeed() 的 Wifi 定位永远不会返回 true,但如果您在户外,Gps 几乎总是返回 true。 location.getExtras() 也有卫星标签,您可以检查仅适用于 Gps 的卫星。如果您正在步行,或者到目前为止我已经阅读过,我还没有在汽车上尝试过,当速度低于 5 公里/小时时,它不是很准确。我的意思是,如果您使用 FLP 并且最后的位置数据包含速度信息,那么它肯定来自 Gps。
有什么不好的地方吗?
从 Android 8.0 及更高版本开始,如果您不使用前台服务或在前台获取位置,而 FLP 和 LocationManager 都没有暂停应用程序,则有 location retrieving limit。
FLP 还要求 GooglePlayService 在用户的设备上可用,并且它应该高于特定版本。 10 或 11 取决于您使用哪一个。如果您希望在禁止 Google Play 服务的国家/地区(例如中国)发布您的应用程序,这可能会很麻烦。
【讨论】:
"Location.hasSpeed() 来自 Wifi 的位置永远不会返回 true,但如果您在户外,Gps 几乎总是返回 true。此外 location.getExtras() 有卫星标签,您可以检查仅可用于 Gps。”谢谢你。非常有帮助。就哪个“更好”而言,取决于您的需求情况。如果您只想要 GPS 结果,也许 FLP 不是最好的?【参考方案4】:现有的答案并没有说明为什么 FusedLocationProvider 更好。
这更好,因为 API 以智能且省电的方式融合了更多数据源(传感器、wifi、上下文、历史记录)。此外,谷歌一直在通过添加更多数据源来改进它。如果您的应用使用它,您将免费获得这些改进。
【讨论】:
这并不好,因为许多位置提供者并不可靠,而且 Google 仍然声称他们的位置非常准确。 Wifi 位置有时真的很糟糕,你无法解决它们。以上是关于Fused Location Provider 是不错的选择吗?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Fused Location Provider 查找位置源
使用 Location Manager 和 Fused Location Provider Api 获取位置有啥区别?
Fused Location Provider - 获得高精度
使 Fused Location Provider LocationClient 更易于使用