位置情報によるタイムゾーン検出(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