位置時區偵測

位置時區偵測功能適用於 Android 12 以上版本,這是可選的自動偵測時區功能,可讓裝置使用位置和時區對應資料來判斷時區。

位置時區偵測是電話時區偵測的替代機制。由於這項功能不需要通訊功能,因此除了行動通訊裝置外,這項功能也支援各種板型規格的裝置。

位置時區偵測功能是由 Android 開放原始碼計畫平台中的下列元件組成:

  • 系統伺服器中的時區偵測邏輯
  • 在 Android 12 中推出的「設定」中,使用者可存取的選項,可讓使用者選擇使用電話或位置時區偵測機制

  • 適用於執行位置偵測和時區對應功能的元件外掛系統。這個外掛程式稱為「位置時區供應器」(LTZP),裝置上最多可有兩個 LTZP。平台提供實作 LTZP 時必須使用的系統 API。

  • 參考 LTZP 實作項目。

  • 主機工具,可從 Open Street Map (OSM) 資料產生參照資料集,並與參照實作項目搭配使用。

使用者隱私

位置時區偵測功能包含下列使用者隱私權功能:

  • 如果有切換鈕可用來選取位置演算法,使用者隨時可以關閉位置演算法。

  • 系統不會將位置衍生的時區建議分享給裝置上的其他使用者。

  • 使用者可以透過「日期和時間」設定畫面,明確控管時區偵測的位置偵測功能。使用者不必透過權限對話方塊明確授予權限。

  • 裝置位置資訊不會傳送至 Android 平台服務。而會發生以下情況:

    • 時區偵測工具服務會透過 LTZP 傳送時區 ID,而非裝置的位置。這是支援位置時區偵測所需的最低 API。
    • 系統整合商會控管個別 LTZP 的運作。LTZP 實作可使用完全儲存在 Android 裝置上的時區地圖資料、使用伺服器或使用混合方法。

功能行為

time_zone_detector 服務會根據從偵測「演算法」收到的建議,決定變更裝置目前的時區的時機。

location_time_zone_manager 服務負責產生 time_zone_detector 位置演算法的建議。location_time_zone_manager 服務會在系統伺服器程序中執行。

location_time_zone_manager 服務不含任何時區偵測邏輯。這項服務負責管理一或兩個 LTZP 外掛程式的生命週期。

如果不需要位置時區偵測,就不會啟動 LTZP。也就是說,除非明確要求,否則位置時區偵測系統不會要求 LTZP 追蹤裝置的位置。導致這種行為的原因包括:

  • 與在正常電話服務作業中被動接收的電話服務信號不同,位置資訊可以主動要求 Android 位置資訊供應器,因此可能會耗用額外電力。
  • 位置設定的範圍為使用者,Android 必須尊重目前使用者的設定。
  • 取得裝置位置資訊會影響隱私權。

此外,location_time_zone_manager 服務會在目前使用者變更設定時提供不確定的建議 (如有需要),以免使用者之間共用位置資訊。

由於這些選項,系統必須先將目前的演算法切換為位置,或切換目前的使用者,才能偵測到時區。這也取決於所使用的 LTZP 導入方式。

AOSP 位置時區偵測實作項目最多可允許兩個 LTZP,分別為主要和次要 LTZP,如下所定義:

主要 LTZP
當使用者允許執行位置時區偵測功能時,隨時執行。
次要 LTZP
如果主要 LTZP 回報時區「不確定」、回報永久失敗,或在初始化期間逾時,就會執行。如果主要 LTZP 提交「特定」建議,就會停止。

如圖 1 所示,time_zone_detector 服務會從電話或位置演算法接收時區建議。位置演算法會接收主要或次要 LTZP 的建議。

位置時區偵測資訊流

圖 1. 位置時區偵測資訊流程。

裝置設定需求

如要支援位置時區功能,裝置必須設定可供裝置使用的 LTZP。裝置必須啟用至少一個 LTZP,並進行設定,才能讓位置時區偵測功能正常運作,並讓使用者在「設定」中看到這項功能。

裝置設定

本節說明裝置製造商如何設定裝置,以支援位置時區偵測功能。

基本 Android 開放原始碼計畫設定位於 frameworks/base/core/res/res/values/config.xml

設定鍵 Android 開放原始碼計畫值 說明
config_enableGeolocationTimeZoneDetection true 這是位置時區偵測功能的主要控制項。

AOSP 預設支援這項功能。您必須啟用或設定至少一個 LTZP,使用者才能使用這項功能。

將值設為 false 可完全停用這項功能,節省少量記憶體。
config_enablePrimaryLocationTimeZoneProvider false 這樣一來即可啟用主要 LTZP。
config_primaryLocationTimeZoneProviderPackageName 將此值設為可找到主要提供者服務的應用程式套件名稱。
config_enableSecondaryLocationTimeZoneProvider false 這樣一來,系統就會啟用次要 LTZP。
config_secondaryLocationTimeZoneProviderPackageName 將此值設為可找到次要提供者服務的應用程式套件名稱。

根據預設,AOSP 設定會將 config_enableGeolocationTimeZoneDetection 鍵設為 true,啟用位置時區偵測功能。由於 Android 開放原始碼計畫預設不會包含 LTZP 設定,因此使用者一開始不會看到這項功能。不過,使用這個預設設定,裝置製造商可以透過指令列啟用及模擬 LTZP 進行測試。(詳情請參閱「偵錯及測試」)。

LTZP 狀態 API

在 Android 14 中,LTZP API 支援 LTZP 回報狀態資訊。如此一來,LTZP 就能回報平臺本身無法自行偵測的問題,因為平台時區偵測元件並未直接在位置演算法中偵測位置和時區。

當系統支援通訊備用模式時,回報 LTZP 行為已因裝置環境而降級的功能就非常實用。舉例來說,如果第三方 LTZP 需要使用自訂設定或權限,才能正常運作,則在降級模式下執行,或因目前裝置設定已停用,LTZP 可以透過 reportSuggestion 方法,將此狀態資訊回報給內部平台元件 (例如「設定」應用程式)。接著,「設定」應用程式就能透過可自訂的字串或自訂項目,通知使用者必須變更某些設定,才能讓位置演算法正常運作,甚至能否運作。

如要進一步瞭解 LTZP 可回報的狀態,請參閱 TimeZoneProviderStatus

LTZP 設定和部署

設定 LTZP 時,請閱讀 frameworks/base/core/java/android/service/timezone/TimeZoneProviderService.java 的原始碼指示。Javadoc 註解會提供服務、所需權限和其他設定的詳細資料。

如要設定 LTZP,裝置製造商必須選擇應用程式程序來代管 LTZP 的服務。為 LTZP 建立專屬程序會造成高額的額外負擔;理想情況下,所選的應用程式程序應為隨時執行的程序,例如系統伺服器。

在搭載模組化系統元件 (模組) 的裝置上,請考量 LTZP 使用的地理資料與時區資料模組 (com.android.tzdata) 中攜帶的時區規則 (tzdb) 之間的互動情形。如果只更新其中一個,而未更新另一個,可能會導致版本偏差問題。詳情請參閱功能採用注意事項

AOSP 參考 LTZP

Android 開放原始碼計畫包含 packages/modules/GeoTZ 下的參考 LTZP 實作項目。本參考實作項目會使用 Android 開放原始碼計畫 API 判斷裝置位置,並使用裝置端資料檔案將位置對應至一組時區 ID。

原始碼中包含其他開放原始碼專案衍生的參照資料集。詳情請參閱 README.md 和各種 LICENSE 檔案。

偵錯及測試

以下章節將說明用於偵錯及測試位置時區偵測功能的 Shell 指令。

與 location_time_zone_manager 服務互動

如果裝置搭載 Android 12 以上版本,且支援定位演算法,Android 會在啟動時例項化 location_time_zone_manager 服務。

如要轉儲 location_time_zone_manager 的目前狀態,請使用:

adb shell cmd location_time_zone_manager dump

如要查看一系列可協助測試的指令列選項,請使用:

adb shell cmd location_time_zone_manager help

說明輸出內容也說明瞭 device_config 服務屬性,這類屬性可用於影響 time_zone_detector 在測試或實際工作環境中的行為。詳情請參閱「使用 device_config 服務設定裝置」一文。

LTZP 實作項目可提供專屬的偵錯或測試支援功能。例如,如果在系統伺服器程序中註冊 Android 開放原始碼計畫參考資料 LTZP,可以使用下列指令對其進行偵錯:

adb shell dumpsys activity service android/com.android.timezone.location.provider.OfflineLocationTimeZoneProviderService