融合定位提供程序是一个好的选择吗?

8

我正在开发一个应用程序,想要使用Fused Location Provider。但是我有一些疑问和几个问题。

  1. 当GPS关闭时,如果我将优先级设置为HIGH,那么这是否意味着GPS会自动打开?
  2. 我能否按需使用Fused提供程序将UpdateLocation与HIGH优先级一起设置以节省电池电量?
  3. 如何知道Fused提供程序在使用什么(是GPS还是网络提供程序)?
  4. Fused提供程序是Android定位的最佳选择吗?它有什么负面影响吗?

请问您的意见是什么? 谢谢。


1
是的,FusedLocationApi 是 Android 最好的选择,它包括了高精度和省电的改进位置更新。请查看此链接以获取更多详细信息 - https://developers.google.com/android/reference/com/google/android/gms/location/FusedLocationProviderApi#constant-summary - Onkar Nene
2
可能是最好的,但这意味着什么也没有。它仍然很糟糕,因为谷歌没有关注 WLAN 路由器的位置变化,这可能导致位置与真实位置相差数千公里,而且似乎谷歌更喜欢 WLAN 位置,即使 GPS 具有正确的值... - The incredible Jan
4个回答

7
当GPS关闭且我将优先级设置为高时,这是否意味着GPS会自动打开?
不会自动打开。但如果您使用SettingsApi,则会提示用户打开GPS,并提供相关信息。如果用户接受,GPS将自动激活。请查看SettingsApi
如何知道Fused提供程序正在使用(它是GPS还是网络提供程序)?
如果您正确使用了Fused Provider API和SettingsApi,它将使当前位置请求所需的设置足够充分。
Fused提供程序真的是Android定位的最佳选择吗?它有什么负面影响吗?
在我看来,在使用Fused Provider之前,您必须直接处理提供程序(GPS、网络)。但Fused只会问您“您希望接收多准确的位置?”

1
如果您正确地使用了融合提供程序API和SettingsApi,它将为当前位置请求提供足够的必要设置。但这并不是回答问题的方法。我真的很讨厌不知道融合提供程序从哪里获取其位置信息。我通过艰难的方式学到,如果位置不来自GPS或GSM,则准确性值是完全无意义的。 - The incredible Jan
2
是的,我知道,建议使用“设置API”并不是一个答案。但是,我们应该对位置的准确性感兴趣,而不是在使用融合定位提供程序时使用了哪个(GPS、网络)。因此,设置API将确保您的位置请求的优先级。顺便说一下,到目前为止,通过“PRIORITY_HIGH_ACCURACY”和适当的设置,我收到了来自融合提供程序的高精度定位信息。 - blackkara

5

就像https://developer.android.com/training/location/index.html中非常明确地说明的那样,将Google Play服务位置API用于为应用程序添加位置感知功能比使用Android框架位置API(android.location)更可取。如果您目前正在使用Android框架位置API,则强烈建议尽快切换到Google Play服务位置API。所以我希望您已经得到了答案。


2
那么,这意味着 Fused 供应商确实是最好的? :) - user6450105
2
是的。至少这是安卓官方文档所说的。我也没有理由不使用Fused API。 - Mahendra Chhimwal
当我们将间隔设置为位置请求对象时,这意味着每5秒我们将获得新位置的更新。如果FusedApi有其他应用程序的位置更新,它甚至可以在间隔之前提供更新。为了最小化这种情况,有一个API setFasInetrval(long miliseconds)。 - Mahendra Chhimwal
@Mahendra Chhimwal 没有反对 Fused API 的原因吗?只有当你不在意 WLAN 给出的完全错误坐标被 Google 声明为准确时... - The incredible Jan
1
如果用户在中国且手机上没有安装 Google Play 服务,那么 fusedLocation 就完全无法工作,对吗? - Saitama
显示剩余2条评论

5
我制作了一个测试应用程序,用于 GPS、Wifi 和 Fused Location Provider 的测试,并且已经测试了两天。它更好,因为它同时使用了它们,并且大多数时候它是最准确的。此外,GPS 数据是非常嘈杂的数据,会导致抖动,为了解决这个问题,使用低通滤波器或其他滤波器。其中一个最成功的滤波器用于获得最准确的结果是 Kalman 滤波器。FusedLocationProvider 使用与 RotationVector 相同的滤波器,后者是一种结合硬件和软件的融合传感器。RotationVector 使用加速度计、陀螺仪(如果可用)和磁场传感器来获取和过滤位置和方位数据。

使用 LocationManager 的 Location.getProvider 获取 Gps 时返回 "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确定位置。设置优先级还确定了电池使用水平。
我能否使用Fused提供程序在需要时将UpdateLocation设置为HIGH优先级以节省电池电量至少一点?
是的,您可以设置位置请求的间隔以及优先级。
mLocationRequest.setInterval(UPDATE_INTERVAL_IN_MILLISECONDS);
mLocationRequest.setFastestInterval(FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS);

我怎样才能知道使用的是融合提供程序(GPS还是网络提供程序)?

通过Wifi获取位置信息时,Location.hasSpeed()从不返回true,但如果你在户外,Gps几乎总是返回true。同时,location.getExtras()有卫星标签,你可以检查卫星数量,这仅适用于Gps。如果你步行或者据我所读,当速度小于5公里/小时时,速度可能不准确。我的意思是,如果你正在使用FLP,并且最后的位置数据包含速度信息,那么它肯定来自Gps。

它有什么缺点吗?

自Android 8.0及以上版本,如果你不使用前台服务或在应用程序未暂停的情况下获取前台位置,FLP和LocationManager都会有位置检索限制

此外,FLP需要用户设备上可用的GooglePlayService,并且它应该在特定版本之上。根据您使用的版本,可能是10或11。如果您希望在禁止Google Play服务的国家(例如中国)发布您的应用程序,则可能会遇到麻烦。

Wifi定位从未返回Location.hasSpeed()的真值,但如果您在户外,则GPS几乎总是返回true。此外,location.getExtras()具有卫星标签,您可以检查卫星是否可用,这仅适用于GPS。非常感谢您的帮助。就“更好”的选择而言,这取决于您的需求情况。如果您只需要GPS结果,那么FLP可能不是最佳选择? - ZephDavies

4

现有的答案并没有说明为什么FusedLocationProvider更好。

FusedLocationProvider更好是因为API从更多的数据源(传感器、wifi、上下文、历史记录)智能而节省电池地融合。此外,谷歌一直在通过添加更多的数据源来改进它。如果您的应用程序使用它,您将免费获得这些改进。


8
许多位置提供者不可靠,而谷歌仍然声称它们的位置非常准确,所以并不一定更好。Wi-Fi 位置有时确实很糟糕,你无法将它们区分出来。 - The incredible Jan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接