本頁面說明要求及管理背景位置資訊使用權限的最佳做法。
要求「一律允許」的位置存取權
自 Android 14 起,應用程式必須具備 ACCESS_BACKGROUND_LOCATION
權限,才能存取使用者的所在位置。Navigation SDK 會在資訊清單檔案中加入這項權限,因此您不需要明確要求這項權限 (除非有其他用途),因為 Gradle 資訊清單合併工具會確保權限與應用程式資訊清單合併。
不過,即使您取得 ACCESS_BACKGROUND_LOCATION
權限,也無法在背景存取位置資訊,因此建議您向使用者要求「允許隨時存取」位置資訊權限。這可確保應用程式可在背景執行並顯示通知,進而提高導航期間的位置準確度。
提示應向使用者說明授予權限後,如何改善應用程式在背景執行時的位置資訊準確度和導航體驗。
如要進一步瞭解如何提示使用者授予位置存取權,請參閱 Android 開發人員說明文件中的「Request location permissions | Sensors and location | Android Developers」。
確保導航通知正確清除
為確保應用程式不會在不再需要通知後,仍保留通知,請務必執行下列清理步驟:
- 呼叫
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 合併作業會處理這項作業。不過,如果在應用程式進入背景之前,未向使用者顯示通知,Navigation SDK 會依賴系統提供位置更新。這些系統更新可能不頻繁或不精確,導致導航體驗不如預期。因此,我們建議您一併提示使用者授予背景位置資訊存取權。
應用程式開發人員可採取哪些行動,提高導航功能的定位精確度
您可以更新應用程式,要求使用者提供背景位置資訊存取權,藉此提高 Navigation SDK 使用的定位信號準確度。詳情請參閱「要求『一律允許』位置存取權」。