位置时区检测在 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