位置時區檢測

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

位置時區檢測是電話時區檢測的替代機制。由於此功能不需要電話,因此除移動電話設備外,各種外形的設備都可以支持此功能。

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

  • 系統服務器中的時區檢測邏輯。
  • Android 12 中引入的設置中用戶可訪問的選項,使用戶能夠在電話和位置時區檢測機制之間進行選擇。
  • 用於執行位置檢測和時區映射的組件的插件系統。插件稱為位置時區提供程序(LTZP),一個設備上最多可以有兩個。
  • 參考 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 時,請閱讀frameworks/base/core/java/android/service/timezone/TimeZoneProviderService.java源代碼中的說明。 Javadoc 註釋提供有關服務、所需權限和其他配置的詳細信息。

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

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

AOSP 參考 Location Time Zone Provider

AOSP 在packages/modules/GeoTZ下包含一個參考 Location Time Zone Provider 實現。此參考實現使用 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

幫助輸出還描述了可用於影響time_zone_detector在測試或生產中的行為的device_config服務屬性。有關更多信息,請參閱使用 device_config 服務配置設備

LTZP 實現還可以提供自己的調試或測試支持。例如,當 AOSP 引用 LTZP 在系統服務器進程中註冊時,您可以使用以下命令對其進行調試。

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