位置時區檢測

位置時區偵測在 Android 12 或更高版本上可用,是一項可選的自動時區偵測功能,允許裝置使用其位置和時區地圖資料來確定時區。

位置時區偵測是電話時區偵測的替代機制。由於此功能不需要電話,因此除了行動電話設備之外,各種外形規格的設備也都支援此功能。

AOSP平台中位置時區偵測功能由以下元件組成:

  • 系統伺服器中的時區檢測邏輯。
  • Android 12 中引入的「設定」中的使用者可存取選項,使用戶能夠在電話和位置時區偵測機制之間進行選擇。

  • 用於執行位置檢測和時區映射的元件的插件系統。插件稱為位置時區提供者(LTZP),設備上最多可以有兩個插件。該平台提供了必須用於實作 LTZP 的系統 API。

  • 參考 LTZP 實作。

  • 託管工具,用於從OpenStreetMap 資料產生可與參考實作一起使用的參考資料集。

用戶隱私

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

  • 當有選擇定位演算法的開關時,使用者可以隨時關閉定位演算法。

  • 基於位置的時區建議不會在裝置上的使用者之間共用。

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

  • 裝置位置資訊不會傳遞到 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 報告時區不確定、報告永久故障或在初始化期間逾時,則執行。如果主 LTZP 提交特定建議,則停止。

如圖 1 所示, time_zone_detector服務從電話或位置演算法接收時區建議。定位演算法接收來自主或輔助 LTZP 的建議。

位置時區偵測資訊流

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

設備配置要求

為了支援位置時區功能,設備必須配置設備可以使用的LTZP。設備需要至少啟用和配置一個 LTZP,位置時區偵測才能正常運作並且對使用者在「設定」中可見。

設備配置

本節介紹設備製造商如何配置設備以支援位置時區偵測。

基本 AOSP 設定位於frameworks/base/core/res/res/values/config.xml

配置鍵AOSP值描述
config_enableGeolocationTimeZoneDetection true這是位置時區偵測功能的主要控制。

AOSP 預設支援該功能。必須啟用或配置至少一個 LTZP 才能使該功能可供使用者使用。

將值設為 false 會完全停用該功能,以節省少量記憶體。
config_enablePrimaryLocationTimeZoneProvider false這將啟用主 LTZP。
config_primaryLocationTimeZoneProviderPackageName將其設定為可以找到主要提供者服務的應用程式的套件名稱。
config_enableSecondaryLocationTimeZoneProvider false這將啟用輔助 LTZP。
config_secondaryLocationTimeZoneProviderPackageName將其設定為可以找到輔助提供者服務的應用程式的套件名稱。

預設情況下,AOSP 配置將config_enableGeolocationTimeZoneDetection鍵設為true ,啟用對位置時區偵測功能的支援。此功能最初對使用者不可見,因為 AOSP 預設不包含 LTZP 配置。但是,使用此預設配置,設備製造商可以從命令列啟用和模擬 LTZP 進行測試。 (有關詳細信息,請參閱調試和測試。)

LTZP 狀態 API

在 Android 14 中,LTZP API 支援 LTZP 報告狀態資訊。這使得 LTZP 能夠報告平台可能無法自行偵測的問題,因為平台時區偵測元件不直接參與位置演算法中的位置或時區偵測。

當支援電話回退模式時,報告 LTZP 的行為已因設備環境而降級的功能非常有用。例如,如果依賴自訂設定或權限進行位置偵測的第三方 LTZP 正在降級模式下運作或被目前裝置設定停用,則它可以向內部平台元件(例如「設定」應用程式)報告此狀態資訊透過reportSuggestion方法。然後,「設定」應用程式可以透過可自訂的字串或自訂項目通知用戶,必須更改某些設定才能使位置演算法正常運作或根本無法運作。

有關 LTZP 可以報告的狀態的更多信息,請參閱TimeZoneProviderStatus

位置時區提供者配置與部署

配置 LTZP 時,請閱讀frameworks/base/core/java/android/service/timezone/TimeZoneProviderService.java原始碼中的說明。 Javadoc 註解提供了有關服務、所需權限和其他配置的詳細資訊。

要配置位置時區提供者,設備製造商必須選擇一個應用程式程序來託管 LTZP 的服務。為 LTZP 建立專用進程是一項很高的開銷;理想情況下,所選的應用程式進程是始終運行的進程,例如係統伺服器。

在具有模組化系統元件(模組)的裝置上,請考慮 LTZP 使用的地理資料與時區資料模組( com.android.tzdata ) 中攜帶的時區規則 (tzdb) 之間的交互作用。更新其中一個而不更新另一個可能會導致版本偏差問題。有關詳細信息,請參閱功能採用注意事項

AOSP 參考 LTZP

AOSP 在packages/modules/GeoTZ下包含參考 LTZP 實作。此參考實作使用 AOSP 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 實作還可以提供自己的調試或測試支援。例如,當 AOSP 引用 LTZP 註冊到系統伺服器進程中時,您可以使用以下命令對其進行偵錯。

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