本页介绍了请求和管理后台位置信息使用权限的最佳实践。
请求“始终允许”位置信息权限
从 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 所用位置信息信号的精确度。如需了解详情,请参阅请求“始终允许”位置信息权限。