位置情報によるタイムゾーン検出

位置情報によるタイムゾーン検出(Android 12 以降で利用可能)は、デバイスで位置情報とタイムゾーン マップデータを使用してタイムゾーンを判別できるようにする、オプションの自動タイムゾーン検出機能です。

位置情報によるタイムゾーン検出は、テレフォニーによるタイムゾーン検出に代わる仕組みです。この機能は、テレフォニーを必要としないため、モバイル テレフォニー デバイスだけでなく、さまざまなフォーム ファクタのデバイスでサポートできます。

位置情報によるタイムゾーン検出機能は、AOSP プラットフォームの以下のコンポーネントから構成されています。

  • システム サーバーのタイムゾーン検出ロジック。
  • 設定ページにあるユーザーがアクセス可能なオプション(Android 12 で導入)。ユーザーがタイムゾーン検出の仕組みをテレフォニーと位置情報から選択できるようにします。

  • 現在地の検出とタイムゾーン マッピングを行うコンポーネント用のプラグイン システム。プラグインは Location Time Zone Provider(LTZP)と呼ばれ、デバイスあたり 2 つまでです。プラットフォームが提供するシステム API を使用して、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(Location Time Zone Provider)というプラグイン(1 つまたは 2 つ)のライフサイクルを管理します。

位置情報によるタイムゾーン検出が不要な場合、LTZP は起動されません。つまり、位置情報によるタイムゾーン検出のシステムは、明示的に求められない限り、LTZP にデバイスの現在地を追跡するように求めることはありません。この動作には、以下のような理由があります。

  • 通常のテレフォニー動作の一環として受動的に受信するテレフォニー信号とは異なり、位置情報は Android 位置情報プロバイダが積極的にリクエストするため、さらなる電力を消費する可能性がある。
  • 位置情報の設定はユーザー スコープであるため、Android はユーザーの現在の設定を尊重する必要がある。
  • デバイスの位置情報を取得するにあたっては、プライバシーに配慮する必要がある。

また、location_time_zone_manager サービスは現在のユーザーが変わったときに不確定な提案を行い(必要な場合)、ユーザー間で位置情報が共有されないようにします。

こうした選択をすると、現在のアルゴリズムを位置情報に切り替えた後、または現在のユーザーを切り替えた後、タイムゾーンが検出されるまでに通常数秒かかります。これは使用されている LTZP の実装によっても異なります。

AOSP の位置情報によるタイムゾーン検出の実装では、LTZP を 2 つまで使用できます(以下の定義のプライマリ LTZP とセカンダリ LTZP)。

プライマリ LTZP
ユーザーが位置情報によるタイムゾーン検出機能の実行を許可した場合に常に実行されます。
セカンダリ LTZP
プライマリ LTZP からタイムゾーンが不確定だと報告された場合、永続的な障害を報告された場合、初期化中にタイムアウトした場合に実行されます。プライマリ LTZP が確定した提案を送信すると停止します。

図 1 のように、time_zone_detector サービスはテレフォニー アルゴリズムまたは位置情報アルゴリズムからタイムゾーンの提案を受け取ります。位置情報アルゴリズムはプライマリ LTZP またはセカンダリ LTZP から提案を受け取ります。

位置情報によるタイムゾーン検出における情報の流れ

図 1. 位置情報によるタイムゾーン検出の情報の流れ

デバイス設定の要件

位置情報によるタイムゾーンの機能をサポートするには、デバイスで使用できる LTZP をデバイスに設定する必要があります。デバイスでは、少なくとも 1 つの LTZP を有効にすること、位置情報によるタイムゾーン検出が機能し、[設定] ページにそれが表示されるように設定することが必要です。

デバイス設定

ここでは、デバイス メーカーが位置情報によるタイムゾーン検出をサポートするようにデバイスを設定する方法について説明します。

基本 AOSP 設定は、frameworks/base/core/res/res/values/config.xml にあります。

設定キー AOSP 値 説明
config_enableGeolocationTimeZoneDetection true 位置情報によるタイムゾーン検出機能のメイン コントロールです。

AOSP ではデフォルトでサポートされています。この機能を使用するには、少なくとも 1 つの LTZP を有効にするか、設定する必要があります。

この値を false に設定すると、この機能が完全に無効になり、メモリを若干節約できます。
config_enablePrimaryLocationTimeZoneProvider false プライマリ LTZP を有効にします。
config_primaryLocationTimeZoneProviderPackageName プライマリ プロバイダ サービスがあるアプリのパッケージ名に設定します。
config_enableSecondaryLocationTimeZoneProvider false セカンダリ LTZP を有効にします。
config_secondaryLocationTimeZoneProviderPackageName セカンダリ プロバイダ サービスがあるアプリのパッケージ名に設定します。

デフォルトでは、AOSP 設定の config_enableGeolocationTimeZoneDetection キーが true に設定されており、位置情報によるタイムゾーン検出機能のサポートが有効になっています。デフォルトでは AOSP に LTZP 設定が含まれていないため、最初はこの機能が表示されません。ただし、デバイス メーカーは、このデフォルト設定を使用して、テスト用にコマンドラインから LTZP を有効にしてシミュレートできます(詳しくは、デバッグとテストをご覧ください)。

LTZP Status API

Android 14 以降では、LTZP API は LTZP レポート ステータス情報をサポートしています。これにより、LTZP はプラットフォームのタイムゾーン検出コンポーネントが位置情報または位置情報アルゴリズムのタイムゾーン検出に直接関与していないため、プラットフォームが検出できない問題を報告します。

LTZP の動作がデバイスの環境によって低下していることを報告する機能は、テレフォニー フォールバック モードがサポートされている場合に役に立ちます。たとえば、位置情報検出に権限のカスタム設定を利用しているサードパーティ LTZP がデグレード モードで実行されている場合、現在のデバイスの設定で無効になっている場合、このステータス情報を reportSuggestion メソッドで設定アプリなどの内部のプラットフォーム コンポーネントに報告します。設定アプリはカスタマイズ可能な文字列または位置情報アルゴリズムを機能させるまたはさせないために変更する必要がある設定のカスタマイズを通じて、ユーザーにそれを通知します。

LTZP で報告できるステータスの詳細は TimeZoneProviderStatus をご覧ください。

LTZP の設定とデプロイ

LTZP を設定するときは、frameworks/base/core/java/android/service/timezone/TimeZoneProviderService.java のソースコードにある手順を確認してください。Javadoc コメントに、サービスの詳細、必要な権限、その他の設定が記載されています。

LTZP を設定するには、デバイス メーカーが LTZP のサービスをホストするアプリプロセスを選ぶ必要があります。LTZP 専用のプロセスを選ぶとオーバーヘッドが大きくなります。システム サーバーなどの常時実行されるプロセスを選ぶのが理想的です。

モジュラー システム コンポーネント(モジュール)を使ったデバイスの場合、LTZP で使用される地理データと、Time Zone Data モジュールcom.android.tzdata)に送られるタイムゾーン ルール(tzdb)との関係を考慮してください。一方を更新せずに他方を更新すると、バージョン スキューの問題が発生する可能性があります。詳細については、機能の採用に関する考慮事項をご覧ください。

AOSP のリファレンス LTZP

AOSP には、packages/modules/GeoTZ に LTZP のリファレンス実装があります。このリファレンス実装では、AOSP API でデバイスの現在地を特定し、デバイス上のデータファイルを使用して現在地をタイムゾーン ID のセットにマッピングします。

他のオープンソース プロジェクトから派生したリファレンス データセットは、ソースコードに含まれています。詳しくは、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

ヘルプ出力には、テスト用と製品版の time_zone_detector の動作に影響を与える device_config サービス プロパティについても説明されています。詳細については、device_config サービスを使用したデバイスの設定をご覧ください。

LTZP の実装では、独自のデバッグやテストのサポートを提供することもできます。たとえば、AOSP のリファレンス LTZP がシステム サーバー プロセスに登録されている場合、そのデバッグに次のコマンドを使用できます。

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