为了尊重用户隐私,鼓励应用开发者仅请求粗略位置权限。需要粗略位置近似值的应用通常使用融合网络位置 (FLP),因为它速度快且功耗低。与基于 Android 的移动设备相比,汽车应用中的网络位置可能更具挑战性。您可以使用两个 Android API
LocationManager API 要求您使用
requestLocationUpdates
明确标识首选位置提供者。Google Play 服务 API 为您提供了一种更直接的方法来使用
FusedLocationProviderClient
中的位置。
许多汽车应用使用 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)
大多数车辆没有实现所需的电话 API 来获取有关小区 ID(和信号强度)的必要信息。因此,由于我们最大限度地减少了数据使用量,因此没有提供 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" />
这种方法确保了与不同垂直领域的设备的最大兼容性,因此,在需要时,应用程序的最大可用性没有代码差异以获取位置。