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

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

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

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

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

提示应向用户说明授予此权限如何提高位置信息准确性,以及如何改善应用在后台运行时的导航体验。

权限对话框示例

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

确保正确清理导航通知

为确保您的应用不会在通知不再需要后让其保持活跃状态,请务必执行以下清理步骤:

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

完成这些步骤可确保在不再需要通知时,系统不会让通知保持活跃状态,这可能会导致电池电量耗尽和内存泄露。

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

如果您的应用使用的是 ForegroundServiceManager,请先调用 NavigationApi#clearForegroundServiceManager,然后再调用 NavigationApi#initForegroundServiceManagerProvider;如果您已初始化 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 合并将会处理该权限。不过,如果在应用进入后台之前未向用户显示通知,Navigation SDK 将依赖系统来提供位置信息更新。这些系统更新可能不会频繁或不精确,并会导致导航体验不佳。因此,我们建议您还应提示用户授予后台位置信息访问权限。

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

您可以通过更新应用来提示用户在后台访问位置信息,从而提高 Navigation SDK 使用的位置信息信号的准确性。如需了解详情,请参阅请求“一律允许”位置信息权限