Определение часового пояса с помощью геолокации

Определение часового пояса по местоположению – это необязательная функция, доступная на устройствах с Android 12 и более поздними версиями ОС. Она позволяет автоматически определять часовой пояс на основе данных о местоположении и карты часовых поясов.

Определение часового пояса по местоположению – это альтернатива определению часового пояса по данным мобильной сети. Поскольку для работы этой функции не требуется телефония, она может поддерживаться на устройствах различных типов, а не только на мобильных телефонах.

Функция определения часового пояса по местоположению состоит из следующих компонентов платформы AOSP:

  • Логика определения часового пояса в системном сервере
  • В Android 12 в настройках появился параметр, позволяющий пользователям выбирать между часовым поясом, полученным от оператора связи, и часовым поясом, определенным по местоположению.

  • Система плагинов для компонентов, которые определяют местоположение и сопоставляют его с часовым поясом. Плагин называется поставщиком часового пояса на основе местоположения (LTZP). На устройстве может быть до двух таких плагинов. Платформа предоставляет системные API, которые необходимо использовать для реализации LTZP.

  • Пример реализации LTZP.

  • Инструменты хоста для создания эталонного набора данных на основе данных Open Street Map (OSM), который можно использовать с эталонной реализацией.

конфиденциальность пользователя;

Функция определения часового пояса по местоположению включает следующие функции конфиденциальности пользователя:

  • Если есть переключатель для выбора алгоритма определения местоположения, пользователи могут отключить его в любое время.

  • Предложения часового пояса на основе местоположения не передаются между пользователями на устройстве.

  • Пользователи могут явно управлять определением местоположения для определения часового пояса на экране Дата и время. Пользователям не нужно явным образом предоставлять разрешение через диалоговое окно.

  • Геоданные устройства не передаются сервисам платформы Android. Вместо этого происходит следующее:

    • Сервисы определения часового пояса получают от LTZP идентификаторы часовых поясов, а не местоположение устройства. Это минимальный уровень API, необходимый для определения часового пояса по местоположению.
    • Системные интеграторы управляют работой отдельных зон LTZP. В реализациях LTZP могут использоваться данные карты часовых поясов, хранящиеся полностью на устройстве Android, серверы или гибридный подход.

Поведение функции

Сервис time_zone_detector определяет, когда нужно изменить текущий часовой пояс устройства, на основе предложений, полученных от алгоритмов.

Сервис location_time_zone_manager отвечает за создание подсказок для алгоритма геолокации time_zone_detector. Сервис location_time_zone_manager работает в процессе системного сервера.

Сервис location_time_zone_manager не содержит логики определения часового пояса. Эта служба отвечает за управление жизненным циклом одного или двух плагинов LTZP.

Если определять часовой пояс не нужно, LTZP не запускаются. Это означает, что система определения часового пояса по местоположению не запрашивает у поставщиков отслеживание местоположения устройства, если в этом нет явной необходимости. Вот некоторые из причин такого поведения:

  • В отличие от сигналов телефонии, которые принимаются пассивно в рамках обычных операций, местоположение может активно запрашиваться у поставщиков геолокации Android и потреблять дополнительную энергию.
  • Настройки геолокации действуют на уровне пользователя, и Android должен учитывать текущие настройки пользователя.
  • Получение данных о местоположении устройства связано с конфиденциальностью.

Кроме того, сервис location_time_zone_manager предлагает неопределенный вариант (если это необходимо), когда текущий пользователь меняет настройки, чтобы избежать передачи информации о местоположении между пользователями.

В результате после переключения текущего алгоритма на местоположение или после переключения текущего пользователя требуется несколько секунд, прежде чем можно будет определить часовой пояс. Это также зависит от реализации LTZP.

Реализация определения часового пояса по местоположению в AOSP позволяет использовать до двух плагинов 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 из командной строки для тестирования. Подробнее об отладке и тестировании…

API статуса LTZP

В Android 14 API LTZP поддерживают информацию о статусе отчетов LTZP. Это позволяет LTZP сообщать о проблемах, которые платформа не может обнаружить самостоятельно, поскольку компоненты определения часового пояса платформы не участвуют напрямую в определении местоположения или часового пояса в алгоритме определения местоположения.

Возможность сообщить, что поведение LTZP ухудшилось из-за окружающей среды устройства, полезна, когда поддерживается резервный режим телефонии. Например, если сторонний поставщик услуг геолокации, который полагается на специальные настройки или разрешения для определения местоположения, работает в ограниченном режиме или отключен текущими настройками устройства, он может передать информацию о своем статусе внутренним компонентам платформы, таким как приложение "Настройки", с помощью метода reportSuggestion. Приложение "Настройки" может уведомлять пользователей с помощью настраиваемых строк или других способов о том, что для корректной работы алгоритма определения местоположения необходимо изменить некоторые настройки.

Подробнее о статусах, которые может передавать LTZPTimeZoneProviderStatus…

Настройка и развертывание LTZP

При настройке LTZP следуйте инструкциям в исходном коде для frameworks/base/core/java/android/service/timezone/TimeZoneProviderService.java. В комментариях Javadoc содержится подробная информация о сервисе, необходимых разрешениях и других настройках.

Чтобы настроить LTZP, производители устройств должны выбрать процесс приложения для размещения сервиса LTZP. Наличие выделенного процесса для LTZP требует больших накладных расходов. В идеале выбранный процесс приложения должен выполняться постоянно, например системный сервер.

На устройствах с модульными системными компонентами (модулями) учитывайте взаимодействие между данными о местоположении, используемыми LTZP, и правилами часовых поясов (tzdb), которые содержатся в модуле данных о часовых поясах (com.android.tzdata). Обновление одного из них без обновления другого, скорее всего, приведет к проблемам с расхождением версий. Дополнительную информацию можно найти в разделе Рекомендации по внедрению функций.

Ссылка на AOSP: LTZP.

В AOSP есть пример реализации LTZP в packages/modules/GeoTZ. В этой эталонной реализации используются API AOSP для определения местоположения устройства и файл данных на устройстве для сопоставления местоположения с набором идентификаторов часовых поясов.

Вместе с исходным кодом предоставляется справочный набор данных, полученный из других проектов с открытым исходным кодом. Подробнее о файле README.md и различных файлах LICENSE…

Отладка и тестирование

В этом разделе описаны команды оболочки для отладки и тестирования функции определения часового пояса по местоположению.

Взаимодействие со службой 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 могут предоставлять собственную поддержку по отладке или тестированию. Например, вы можете использовать следующую команду, чтобы отладить справочный LTZP AOSP, когда он зарегистрирован в процессе системного сервера:

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