位置時區偵測功能適用於 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