为了尊重用户隐私,建议应用开发者仅请求粗略位置信息权限。需要粗略位置信息权限的应用通常会使用融合网络位置信息 (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)及更高版本中,之前只能通过 Google Play 服务 API 访问的 FUSED_PROVIDER 可作为位置信息提供程序供 LocationManager 使用。您可以在 FusedLocationProvider.java 中查看 FLP 的实现。
虽然只获取粗略位置信息权限就可以使用 GPS_PROVIDER,但该框架会人为降低精确度来满足预期。这对于以 Android 手机为目标设备的开发者而言意义不大,因为该框架整体可用性很差,并且获取粗略位置信息的速度较慢。
汽车中的网络位置信息
Android 手机(提供 Google 移动服务)使用的 NETWORK_PROVIDER 会根据附近的手机基站、Wi-Fi 接入点和蓝牙 (BT) 信标确定位置。因此,NETWORK_PROVIDER 可能需要连接数据网络。
对于汽车应用,设备约束条件各不相同。由于全球导航卫星系统 (GNSS) 通常处于开启状态,因此不会因耗电量和电池用量增加而带来不利影响。因此,IVI 的正常运行时间不会受到影响。我们会尽量减少与我们的服务器交换的数据。
因此,许多应用会使用 Google Play Services API 中的 FLP,而不是直接使用 LocationManager,因为 FLP 会使用最符合位置信息请求标准/政策(即耗电量和精确度)的位置信息提供程序,自动执行智能操作。
与移动设备不同,车辆极少会出现从一个位置“跳”到另一个位置的情况。车辆位置大部分时间在系统内部都是可以追踪的。
网络位置信息提供程序 (NLP)
大多数车辆都未实现所需的电话 API 来获取关于基站 ID(和信号强度)的所需信息。因此,由于我们能够最大限度地减少流量消耗,Google 不会提供 NLP 的其他功能实现。
一体化位置信息提供方
移动设备 FLP 除了根据需要智能地使用网络和 GPS 提供程序之外,还会融合其他传感器的信息,进一步提高位置信息的质量。另一方面,汽车 FLP 的当前实现利用了上述假设,并始终将 GPS_PROVIDER 用作基础来源。它会更改来自 GNSS 的位置信息,在需要时增加一些错误,使其变得更加不准确。例如,在向客户端提供粗略位置时。
因此,在极少数情况下,提供第一个位置的时间可能会比平时要长。例如,首次使用车辆时(更确切地说是使用位置信息子系统时),或车辆被拖走后。
针对移动设备和汽车用途设计应用
对于面向移动设备和车载设备的应用,如果对精确度要求不高,我们建议仅请求 android.permission.ACCESS_COARSE_LOCATION,并在 FLP 可用时转为使用 FLP。或者,您也可以通过相同权限直接使用 GPS_PROVIDER。框架会降低底层 GNSS 位置的精确度,以符合 API 预期。如需了解详情,请参阅请求位置信息权限中的精确度。
此外,这些应用必须在其清单中明确声明 android.hardware.location.network 功能为可选功能。例如:
<uses-feature android:name="android.hardware.location.network" android:required="false" />
这种方法有助于提高与各种规格设备的兼容性,从而尽可能提升应用可用性(没有任何代码差异),以便在需要时获取位置信息。