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

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

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

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

  • システム サーバーのタイムゾーン検出ロジック。
  • 設定ページにあるユーザーがアクセス可能なオプション(Android 12 で導入)。ユーザーがタイムゾーン検出の仕組みをテレフォニーと位置情報から選択できるようにします。
  • 現在地の検出とタイムゾーン マッピングを行うコンポーネント用のプラグイン システム。プラグインは LTZP(Location Time Zone Provider)と呼ばれ、デバイスあたり 2 つまでです。
  • 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 の位置情報によるタイムゾーン検出の実装では、2 つまでの LTZP が可能です(以下の定義のプライマリ 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 の設定と導入

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