获取粗略位置信息

为了尊重用户隐私,鼓励应用开发者只请求粗略位置权限。通常需要粗略近似位置的应用使用融合网络位置 (FLP),因为它速度快且功耗低。与基于 Android 的移动设备相比,汽车应用中的网络位置可能更具挑战性。您可以使用两个 Android API

许多汽车应用使用来自 Google Play 服务 API 的 FLP,而不是 LocationManager。FLP 根据车辆所需的位置请求条件和策略(功耗和精度)选择最佳位置提供程序。

您可以选择显式请求并使用NETWORK_PROVIDER以及GPS_PROVIDER来获取精确位置,这需要android.permission.ACCESS_FINE_LOCATION权限。在 Android 12(API 级别 31)及更高版本中,FUSED_PROVIDER(以前仅可通过 Google Play 服务 API 访问)可作为位置提供程序提供给LocationManager。您可以在FusedLocationProvider.java中看到 FLP 的实现。

虽然可以使用GPS_PROVIDER和粗略权限——框架会人为降低精度以符合预期——但这对于面向 Android 手机的开发者来说意义不大,因为整体可用性差,并且获得粗略位置的速度通常较慢。

车载网络定位

在 Android 手机(具有 Google 移动服务)上使用的NETWORK_PROVIDER基于附近的基站、Wi-Fi 接入点和蓝牙 (BT) 信标确定位置。因此,NETWORK_PROVIDER可能需要数据连接。

对于车载应用,设备约束有所不同。由于全球导航卫星系统 (GNSS) 通常处于开启状态,因此不会因功耗和电池使用增加而产生任何惩罚。因此,IVI 运行时间不会受到影响。我们力求最大限度地减少与服务器交换的数据。

因此,许多应用程序使用 Play API 中的 FLP 而不是直接使用LocationManager,因为 FLP 会自动执行“智能操作”,即使用最能满足位置请求标准/策略(即功耗和精度)的位置提供程序。

与移动设备不同,车辆很少出现从一个地方“跳跃”到另一个地方的情况。大多数情况下,车辆位置在后台都是已知的。

网络位置提供程序 (NLP)

大多数车辆未实现获取所需小区 ID(和信号强度)信息的必要电话 API。因此,并且由于我们最大限度地减少了数据使用量,因此不提供 NLP 的额外功能实现。

融合位置提供程序

移动 FLP 除了根据需要巧妙地使用网络和 GPS 提供程序外,还会融合来自其他传感器的信息以进一步提高位置质量。另一方面,汽车的 FLP 的当前实现利用了上述假设,并始终使用GPS_PROVIDER作为底层来源。它会篡改 GNSS 的位置,添加一些误差以在需要时更不精确。例如,当向客户端提供粗略位置时。

因此,在极少数情况下,第一个位置可用时间可能会比平时更长。例如,第一次使用车辆或更准确地说,其定位子系统,或被拖走之后。

设计适用于移动和车载用途的应用

对于面向移动设备和车载设备且不需要更高精度等级的应用,只需请求android.permission.ACCESS_COARSE_LOCATION,并在可用时回退到使用 FLP。或者,直接使用GPS_PROVIDER和相同的权限。框架会降低底层 GNSS 位置的精度,以符合 API 预期。要了解更多信息,请参阅精度中的请求位置权限

此外,这些应用必须在其清单中将android.hardware.location.network功能显式声明为可选。例如

<uses-feature android:name="android.hardware.location.network" android:required="false" />

这种方法可确保与各种设备的最大兼容性,从而确保应用在无需代码差异的情况下即可获得所需位置的最大可用性。