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