后台位置信息使用最佳实践

本页介绍了请求和管理后台位置信息使用权限的最佳实践。

请求“始终允许”位置信息权限

从 Android 14 开始,应用必须具有 ACCESS_BACKGROUND_LOCATION 权限才能访问用户的位置信息。Navigation SDK 在其清单文件中包含此权限,因此您无需明确请求此权限(如果不需要用于其他用途),因为 Gradle 清单合并器会确保此权限与应用的清单合并。

不过,仅拥有 ACCESS_BACKGROUND_LOCATION 权限不足以在后台访问位置信息,我们建议您向用户请求“始终允许”位置信息权限。这样可确保应用在后台运行并显示通知,从而在导航期间最大限度地提高位置信息精确度。

提示应向用户说明,授予该权限后,应用在后台运行时,位置信息精确度会提高,导航体验也会得到改善。

权限对话框示例

如需详细了解如何提示用户授予位置信息访问权限,请参阅 Android 开发者文档中的请求位置信息权限 | 传感器和位置信息 | Android 开发者

确保正确清理导航通知

为确保应用不会在不再需要通知后仍保持通知处于有效状态,请务必执行以下清理步骤:

  • 调用 startGuidance() 后,请务必调用 stopGuidance()clearDestination()
  • 注册 ArrivalListener 后,请务必将其取消注册。
  • 注册 RoadSnappedLocationProvider 后,请务必将其取消注册。

完成这些步骤可确保在不再需要通知时不会让通知保持活动状态,从而避免电池电量耗尽和可能出现的内存泄漏。

重新调用 NavigationApi#initForegroundServiceManager 方法时,请先调用 NavigationApi#clearForegroundServiceManager

如果您的应用使用的是 ForegroundServiceManager,请在调用 NavigationApi#initForegroundServiceManagerProvider 之前调用 NavigationApi#clearForegroundServiceManager;如果您已初始化 ForegroundServiceManager,请调用 NavigationApi#initForegroundServiceManagerMessageAndIntent。您可以在初始化前台服务管理器后执行此操作,以更新通知 ID 或通知内容。

Android 14 中引入的新限制简介

Android 14(Android U)针对应用在后台访问用户位置信息引入了新的限制。为了帮助缓解这些变化,Navigation SDK 在版本 5.4.0 中进行了更新,以更好地管理后台位置信息访问权限。我们还建议您更新实现,以确保应用继续能够访问最精确的位置数据。

Android 14 中的变更对 Navigation SDK 的影响

当您在应用中调用 startGuidance() 时,前台服务会开始显示逐向导航的用户通知。精细导航功能需要能够访问用户的位置信息,以便更新路线并显示正确的视觉和音频引导。从 Android 14 开始,在后台访问用户的精确位置信息需要获得用户授予的权限。默认情况下,如果应用未获得用户授予的后台位置信息访问权限,并尝试启动前台服务以获取位置信息更新,系统会抛出 SecurityException,导致应用崩溃。

Navigation SDK 如何缓解此问题

从版本 5.4.0 开始,Navigation SDK 会处理此 SecurityException,而不会影响应用,从而允许导航在后台继续运行。此外,Navigation SDK 还会在其 AndroidManifest 中包含 ACCESS_BACKGROUND_LOCATION 权限。这样一来,您的应用就不需要自行声明该权限,因为 Gradle 合并会处理该权限。不过,如果应用在进入后台之前未向用户显示通知,导航 SDK 将依赖系统来提供位置更新。这些系统更新可能不够频繁或不够精确,从而导致导航体验欠佳。因此,我们建议您也提示用户授予后台位置信息访问权限。

应用开发者可以采取哪些措施来提高导航的定位精确度

您可以更新应用,提示用户授予后台位置信息访问权限,从而提高 Navigation SDK 所用位置信息信号的精确度。如需了解详情,请参阅请求“始终允许”位置信息权限