为了尊重用户隐私,建议应用开发者仅请求粗略位置权限。需要粗略近似位置的应用通常使用融合网络位置 (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)
大多数车辆不实现获取蜂窝 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" />
这种方法可确保在不同垂直领域设备上的最大兼容性,从而在需要获取位置时无需代码差异即可实现最大应用可用性。