このページでは、Android での時刻とタイムゾーンの検出方法を説明します。これには、Android で自動的に時刻とタイムゾーンを検出する仕組み、デバイス メーカーの設定オプション、テスト情報が含まれます。
時刻とタイムゾーンの概要
Android では、ステータスバーなどの場所に表示するユーザーの現地時刻を特定するため、次の 2 つの関連する独立した状態を追跡しています。
- 現在の Unix エポック時刻
- 現在のタイムゾーン
現在の Unix エポック時刻と現在のタイムゾーンはデバイス全体の状態です。つまり、デバイスのすべてのユーザー間で共有されます。
現在の Unix エポック時刻は固定値ではありません。時間の経過を反映して自動的に更新されます。デバイスの現在の Unix エポック時刻は、通常の時間経過に加えて、デバイスの電源が切れた後などに正しくないことが判明した場合に調整されます。
現在のタイムゾーンによって、現在の Unix エポック時刻を現地時刻に変換するための調整量が決まります。たとえば、夏のロサンゼルスでは、現在の Unix エポック時刻から 7 時間を差し引き、冬には 8 時間を差し引きます。
こうした現地時刻の計算をサポートするため、すべての Android デバイスには、すべてのグローバル タイムゾーン ルールのデータベースが保持されています。タイムゾーン ルールの詳細については、タイムゾーン ルールをご覧ください。
ユーザーが別のタイムゾーンを使用している場所に移動した場合、現在の Unix エポック時刻は調整する必要がありませんが、通常は以前の場所の時刻ではなく現地時刻の表示が求められます。現在のタイムゾーンを変更すると、新しい場所の正しい現地時刻を表示するために、現在の Unix エポック時刻に正しいオフセットが適用されます。
AOSP では、以下のメカニズムで時刻とタイムゾーンを自動的に設定するかどうかをユーザーが独立に制御できます。
- 時刻の自動検出: デバイスの現在の Unix エポック時刻を正しい時刻に合わせます。
- タイムゾーンの自動検出: デバイスの現在のタイムゾーンを正しいタイムゾーンに設定します。
時刻の自動検出
ここでは、時刻の自動検出、ユーザー コントロール、設定オプション、テストの詳細を管理する time_detector
サービスの概要を説明します。
time_detector サービス
Android 10 以降を搭載したデバイスにある time_detector
サービスは、時刻の自動検出を管理します。時刻の自動検出が有効になっているときに、必要に応じてデバイスの現在の Unix エポック時刻を調整します。
常に time_detector
サービスは、「確定」(certain)か「不確定」(uncertain)かのどちらかの状態にあります。サービスが確定状態になるか不確定状態になるかは、さまざまなソースから受け取る時刻の提案によって決まります。
time_detector
サービスが確定状態にあるとき、つまり Unix エポック時刻の情報で提案を受け取っているときに、時刻の提案が現在の Unix エポック時刻と異なっている場合は、現在の Unix エポック時刻がオーバーライドされます。
time_detector
が不確定状態であるときには、現在時刻はオーバーライドされません。不確定状態は、通常、time_detector
サービスが時刻の提案を受け取っていないことを意味します。また、time_detector
サービスは、受け取った提案が古すぎて使用できないと見なされた場合でも不確定状態になります。提案の新しさが考慮されるのは、古い Unix エポック時刻の提案を使用する調整がリアルタイム クロックに依存しており、リアルタイム クロックは時間が経過すると不正確になると想定されるためです。
デバイスで現在の Unix エポック時刻を自動的に設定するために使用できるソースにはさまざまなものがあります。このドキュメントでは、これらのソースを「オリジン」と呼びます。time_detector
サービスは、一連の提案をそのオリジンに基づき別個のものとして扱います。
time_detector
サービスはステートフルです。つまり、各オリジンが行った最新の提案が記録されます。オリジンに新しい Unix エポック時刻の情報がある場合、time_detector
に新しい提案が行われます。time_detector
サービスは提案を受け取ると、新しい提案と既存の提案を再評価してデバイスの状態を更新します。
UTC 時刻は国際的に認められているものですが、さまざまな理由により、Android デバイスで現在の Unix エポック時刻を設定するのは必ずしも簡単なことではありません。
- Unix エポック時刻は、UTC 時刻とは微妙に異なる時間管理システムです。両者間での変換には、うるう秒がいつ発生し、それがオリジンでどう扱われるかを把握している必要があります。
- オリジンは特定の時間や状況でのみ利用できます。たとえば、オリジンにネットワーク接続が必要な場合、利用できるのはデバイスがインターネットに接続されている間だけです。
- オリジンが間違っている場合、精度が低い場合、誤差がある場合があります。たとえば、テレフォニーの基地局が「世界時」を正しく追跡していない場合、テレフォニー オリジンが不正確な時刻を提案します。
- Unix エポック時刻の取得中に誤差が発生することがあります。たとえば、ネットワークの遅延、バッファリング、プロセス スケジューリングが原因で、Unix エポック時刻が不正確になる場合があります。
- 提案を受け取ってから経過した時間で補正するために使用する基準時計が正確でない可能性があります。
AOSP においてデフォルトで使用されるように設定されている主な時刻検出オリジンには、次の 2 つがあります。
- ネットワーク: ネットワーク タイム プロトコル(NTP)のタイムサーバーを使用します。
- テレフォニー: ネットワーク ID とタイムゾーン(ITZ)のテレフォニー信号を使用します。
テレフォニー オリジンとネットワーク オリジンは、どちらも外部ネットワークへの接続を必要としますが、接続は常にあるわけではありません。
Android 12 以降では、以下のオリジンもサポートされています(デフォルトでは使用するように設定されていません)。
時刻の設定
ユーザーは、AOSP の設定アプリの [システム] > [日時] で自動時刻検出を有効にできます。
図 1. 設定画面の自動時刻検出
次の表は、AOSP 設定アプリの時刻検出に対するユーザー コントロールを示しています。
*Android 11 以前では、この設定に [ネットワークから提供された時刻を使用する] というラベルが表示されます。 |
|||
AOSP 設定の場所 | AOSP 設定の名前 | 範囲 | 動作 |
---|---|---|---|
[システム] > [日時] | 日時を自動的に設定 * | すべてのユーザー | 切り替え。 オンの場合、デバイスが現在の Unix エポック時刻を検出します。オフの場合、デバイスの時刻を手動で設定するためのコントロールが表示されます。 |
ユーザーが手動で時刻を入力する場合は、Unix エポック時刻ではなく現地時刻を入力します。現在の Unix エポック時刻は、現在のタイムゾーンを使って算出されます。
設定
デバイス メーカーは、使用するオリジンやオリジンからの信号の優先度など、さまざまな設定を time_detector
サービスに行います。
オリジンの優先度
Android 12 以降では、デバイス メーカーが core/res/res/values/config.xml
設定ファイルを変更して、自動時刻検出に含める時刻オリジンと、time_detector
がこれらのオリジンを考慮する優先度を指定できます。
Android 11 以前を搭載したデバイスでは、オリジンの優先度は ["telephony", "network"]
にハードコードされています。つまり、ネットワークの提案よりもテレフォニーの提案が優先されます。
デフォルトの AOSP 設定は次のとおりです。
<!-- Specifies priority of automatic time sources. Suggestions from higher entries in the list
take precedence over lower ones.
See com.android.server.timedetector.TimeDetectorStrategy for available sources. -->
<string-array name="config_autoTimeSourcesPriority">
<item>network</item>
<item>telephony</item>
</string-array>
Android 12 では、デフォルトで使用するオリジンとして、ネットワークの提案とテレフォニーの提案が設定されています。ネットワークの時刻提案は、テレフォニーの時刻提案よりも優先されます。デバイス メーカーは、テレフォニーの優先度が高い Android 11 以前の動作に戻すために、オリジンの順序を変更できます。
デフォルトでは、優先度が最も高い有効な提案が、デバイスの現在のシステム クロック時刻と数秒以内で一致する場合も、デバイス時刻は変更されません。これは、ACTION_TIME_CHANGED
インテントを受信待機するインストール済みのアプリに処理を発生させないようにするためです。
指定できるオリジンの値は次のとおりです。
許容される時間の範囲
Android 14 では、time_detector
サービスから受け取る時刻の提案に対する上限時刻が導入されます。デバイスで 32 ビットプロセスに対応している場合、フレームワークは上限時刻を設定し、デバイスが Y2038 の問題をトリガーする可能性のある時刻の提案を使用しないようにします。
Android 12 では、time_detector
サービスで受け取った時刻の提案の検証に使用する下限時刻が導入されました。自動的な提案で使用される下限時刻の値はビルド タイムスタンプから設定されます。これは有効な時刻はデバイスのシステム イメージをビルドした時刻より前にはならないという原則に基づいています。時刻の提案が下限時刻よりも前の場合、ビルド タイムスタンプが正しければそれは有効ではないため、time_detector
サービスはその提案を破棄します。
Android 11 以前を搭載しているデバイスの場合、time_detector
サービスは受け取った Unix エポック時刻の提案を検証しません。
時刻のデバッグとテスト
ここでは、time_detector
サービスと、すべてのオリジンで共有される他のコンポーネントの動作のデバッグとテストを行う方法について説明します。
time_detector サービスを操作する
time_detector
サービスの設定と time_detector
サービスの状態を表示するには、次のコマンドを使用します。
adb shell cmd time_detector dump
タイムゾーン検出のデバッグとテストを行うためのその他のコマンドを確認するには、次のコマンドを使用します。
adb shell cmd time_detector help
ヘルプ出力には、テスト用と製品版の time_detector
の動作に影響を与える device_config サービス プロパティについても説明されています。詳細については、device_config サービスを使用したデバイスの設定をご覧ください。
自動時刻検出を検証するには、テスターが time_detector
サービスで使用されているオリジンを認識している必要があります。以下に adb shell cmd time_detector dump
コマンドからの出力例を示します。現在のオリジンとサービスの状態に関する情報を太字にしています。
$ adb shell cmd time_detector dump
TimeDetectorStrategy:
mLastAutoSystemClockTimeSet=null
mEnvironment.isAutoTimeDetectionEnabled()=true
mEnvironment.elapsedRealtimeMillis()=23717241
mEnvironment.systemClockMillis()=1626707861336
mEnvironment.systemClockUpdateThresholdMillis()=2000
mEnvironment.autoTimeLowerBound()=2021-07-19T07:48:05Z(1626680885000)
mEnvironment.autoOriginPriorities()=[network,telephony]
Time change log:
...
Telephony suggestion history:
...
Network suggestion history:
...
Gnss suggestion history:
...
External suggestion history:
...
この情報は以下のように解釈できます。
キー | 値 |
---|---|
mEnvironment.isAutoTimeDetectionEnabled() |
自動時刻検出が有効かどうか。 |
mEnvironment.autoTimeLowerBound() |
時間提案の検証に使われる現在の下限。 |
mEnvironment.autoOriginPriorities() |
使用中のオリジンと優先順位。 |
時間変更ログは、time_detector
サービスがデバイスの現在の Unix エポック時刻を変更した場合を示しています。
提案の履歴情報は各オリジンが行った提案を示しています。
タイムゾーンの自動検出
ここでは、タイムゾーンの自動検出、設定ページのユーザー コントロール、テレフォニーと位置情報によるタイムゾーン検出、テストの詳細を管理する time_zone_detector
サービスの概要を説明します。
time_zone_detector サービス
Android 11 以降を搭載したデバイスにある time_zone_detector
サービスは、タイムゾーンの自動検出を管理します。タイムゾーンの自動検出が有効になっているときに、必要に応じてデバイスの現在のタイムゾーンを調整します。
タイムゾーンの自動検出が有効になっているとき、time_zone_detector
は確定状態(certain)か不確定状態(uncertain)のどちらかの状態にあります。
time_zone_detector
サービスが確定状態にあるときは、time_zone_detector
サービスが確度の高いタイムゾーン情報を受け取ったことを意味します。これにより、現在のタイムゾーンがオーバーライドされる可能性があります。不確定状態にあるときは、情報を受け取っていないか、信頼度の低い情報しか受け取っていないことを意味します。この場合、現在のタイムゾーンはオーバーライドされません。
time_zone_detector
サービスの確定状態には、time_zone_detector
で使用するタイムゾーン情報がない状態と、複数のタイムゾーンから選択できる状態があります。具体的には以下のような状態です。
- タイムゾーンがない確定状態は、デバイスがタイムゾーンのない場所(公海や紛争地域など)にあるときに発生します。この状態は不確定状態に似ていますが、
time_zone_detector
がタイムゾーンを特定するのにそれ以上のアクションを必要としないことを示します。 - 複数のタイムゾーンがある確定状態は、曖昧さや境界条件がある場所で発生します。この状態では、現在のタイムゾーンが
time_zone_detector
で確定しているタイムゾーンのいずれかである場合、現在のタイムゾーンのままとなります。そうでない場合は、使用可能なタイムゾーンのいずれかが使用されます。これにより、ユーザーが以前にタイムゾーンを手動で選択した場合や、デバイスが境界に近づいたときでも、time_zone_detector
は基本的に安定したものとなります。
time_zone_detector
サービスの状態が確定状態か不確定状態かは、アルゴリズムから受け取るタイムゾーンの提案によって決まります。
通常、提案には time_zone_detector
の状態(確定と不確定)にほぼ一致する 2 つの種類があります。提案の種類の例を次に示します。
type =
uncertain
、zoneIds = []
- アルゴリズムでタイムゾーンが把握されていない。
type =
certain
、zoneIds = ["Europe/London"]
- アルゴリズムでタイムゾーンが Europe/London であることが確定している。
type =
certain
、zoneIds = []
- アルゴリズムでは確定しているが、現在の場所に関連付けられたゾーン ID がない。
type =
certain
、zoneIds = ["America/Denver", "America/Phoenix"]
- アルゴリズムでは「America/Denver」と「America/Phoenix」のどちらかが正しいと確定しているが、どちらかを選ぶことはできない。
time_zone_detector
サービスは一連の提案をそのアルゴリズムに基づき別個のものとして扱います。アルゴリズムによっては、アルゴリズムの確度を示すメタデータが提案に含まれる場合があります。
time_zone_detector
サービスはステートフルです。つまり、各アルゴリズムが行った最新の提案が記録されます。以前の提案が正しくなくなった場合、つまり、アルゴリズムに別の提案が追加された場合や、アルゴリズムがタイムゾーンを検出できなくなった場合、新しい提案が time_zone_detector
サービスに送信されます。time_zone_detector
サービスは提案を受け取ると、新しい提案と既存の提案を再評価してデバイスの状態を更新します。
Android ではタイムゾーン検出に以下の 2 つのアルゴリズムをサポートしています。
- テレフォニー
- 位置情報
time_zone_detector
サービスは通常 1 つのアルゴリズムを使って、タイムゾーンを検出します。位置情報アルゴリズムがデバイスでサポートされている場合、デバイスが使用するアルゴリズムはユーザーが設定したタイムゾーンの設定に基づき決まります。使用されているアルゴリズムでタイムゾーンが不確定状態になった場合、通常 time_zone_detector
は別のアルゴリズムからの提案を使用しません。使用されていないアルゴリズムに関連する提案は、time_zone_detector
によってメモリに保持されますが、アルゴリズムを変更しない限り使用されません。ユーザーがタイムゾーンの自動検出の設定を変更し、現在のアルゴリズムが変更されると、新しいアルゴリズムで利用可能な最新の提案が使用されます。
複数のアルゴリズムを使ってタイムゾーンを判断するケースについて詳細は、テレフォニー フォールバック モードをご覧ください。
テレフォニー フォールバック モード
Android 13 以降を搭載したデバイスでは、time_zone_detector
サービスはテレフォニー フォールバック モードをサポートします。このモードでは、位置情報による検出でタイムゾーンを検出できない場合や、位置情報によるタイムゾーンの検出がテレフォニーによる検出より時間がかかる場合、Android は一時的にテレフォニーによる検出の提案を使用します。
テレフォニー フォールバック モードは、テレフォニーによる検出と位置情報による検出の両方がサポートされていて、ユーザーがタイムゾーンの設定で [タイムゾーンの設定に位置情報を使用] を有効にしているデバイスに適用されます。このモードは、デバイスを再起動したときと機内モードを解除したときに、自動的に有効になります。
Android 14 以降では、テレフォニー フォールバックは LTZP Status Reporting API からトリガーされます。つまり、LTZP が不確定と報告し、かつ環境によって LTZP の位置情報またはタイムゾーンを検出する能力が低下している場合に、テレフォニー フォールバック モードがトリガーされます。
テレフォニー フォールバック モードが有効になっているとき、time_zone_detector
サービスは、位置情報のアルゴリズムが確定的な提案を行うまでは、位置情報による検出が無効になっている場合と同様にテレフォニーの提案を使用します。確定的な提案を受け取ると、テレフォニー フォールバック モードは無効になり、位置情報の提案のみが使用されます。
テレフォニー フォールバック モードの設定の詳細については、タイムゾーン検出の設定をご覧ください。
タイムゾーンの設定
ユーザーは AOSP の設定アプリで、タイムゾーンの自動検出を有効にして設定することができます。
図 2. 設定画面の自動タイムゾーン検出
次の表は、AOSP 設定アプリにあるタイムゾーン検出のユーザー コントロールを示しています。
*Android 11 以前では、この設定に [ネットワークから提供されたタイムゾーンを使用する] というラベルが表示されます。 |
|||
AOSP 設定の場所 | AOSP 設定の名前 | 範囲 | 動作 |
---|---|---|---|
[システム] > [日時] | タイムゾーンを自動的に設定 * | すべてのユーザー | 切り替え。 オンの場合、デバイスが現在のタイムゾーンを検出します。オフの場合、デバイスのタイムゾーンを手動で設定するためのコントロールが表示されます。 |
[システム] > [日時] | タイムゾーンの設定に位置情報を使用 | 現在のユーザー | 切り替え。 Android 12 以降で利用できます。この切り替えは位置情報によるタイムゾーン検出がデバイスでサポートされている場合にのみ表示されます。 Android 14 で適用された変更については、位置情報によるタイムゾーン検出アルゴリズムのみをサポートするデバイスをご覧ください。 |
位置情報 | 位置情報の使用 | 現在のユーザー | 切り替え。 デバイスの位置情報を使用することを広く許可または禁止します。値は、位置情報によるタイムゾーン検出がデバイスでサポートされている場合に関連します。 |
以下に、タイムゾーン検出がデバイスでどのように動作するかの概要を、ユーザーが選択した設定ごとに示します。
[日時] タイムゾーンを自動的に設定: オフ
- ユーザーがタイムゾーンを手動で選択する必要があります。
[日時] タイムゾーンを自動的に設定: オン
[位置情報] 位置情報を使用: オフ
- テレフォニー信号がタイムゾーンの検出に使用されます。
[位置情報] 位置情報を使用: オン
[日時] タイムゾーンの設定に位置情報を使用: オン
- タイムゾーンの検出に位置情報が使用されます。
[日時] タイムゾーンの設定に位置情報を使用: オフ
- テレフォニー信号がタイムゾーンの検出に使用されます。
マルチユーザーのデバイス
関係する設定の一部が現在のユーザーを対象範囲とするため、現在のユーザーがマルチユーザーの Android デバイスで変更されたときに、タイムゾーン検出の動作が変わります。
[タイムゾーンの設定に位置情報を使用] の切り替えの対象範囲は現在のユーザーに限定されており、デバイス ポリシーによって制限されません。つまり、[タイムゾーンを自動的に設定] の切り替えがオフになっているか、Device Policy Controller によって他の時刻またはタイムゾーンのコントロールが制限されている場合でも、ユーザーは常にその値を変更できます。
位置情報によるタイムゾーン検出アルゴリズムのみをサポートするデバイス
このセクションでは、位置情報アルゴリズムのみをサポートするデバイスの動作について説明します。
Android 14 以降
- AOSP 設定アプリで [位置情報を使用する] オプションはユーザーには表示されず、デバイスは [位置情報を使用する] オプションが有効になっている場合と同様に動作します。
- ユーザー スコープの
SettingsProvider
設定のlocation_time_zone_detection_enabled
の値は無視されます。この値は他のタイプのデバイスのユーザー設定を記録します。
Android 12 または Android 13
- AOSP 設定アプリで [位置情報を使用する] オプションはユーザーには表示され、ユーザーはオプションを無効にできます。オプションを無効にすると、デバイスはタイムゾーンを自動的に検出しなくなります。
自動検出に切り替えた場合と手動検出に切り替えた場合の動作
ユーザーがタイムゾーンの検出を手動から自動に切り替えたとき、time_zone_detector
ですでに現在のタイムゾーンを確定されている場合があります。その場合、ユーザーが自動検出を有効にすると、time_zone_detector
サービスによる評価に合わせてデバイスのタイムゾーンも同時に変更されることがあります。
同様に、ユーザーが設定画面で time_zone_detector
サービスの現在のアルゴリズムを変更するような変更を加えたとき、time_zone_detector
は新しいアルゴリズムの提案をすでに受け取っているため、デバイスの時刻が time_zone_detector
サービスによる評価に合わせてすぐに変更される場合があります。
テレフォニーによるタイムゾーン検出
テレフォニーによるタイムゾーン検出では、テレフォニー信号を使用して現在のタイムゾーンを特定します。詳細については、テレフォニーによるタイムゾーン検出をご覧ください。
位置情報によるタイムゾーン検出
位置情報によるタイムゾーン検出は、Android 12 以降で利用できます。これはオプションの自動タイムゾーン検出機能であり、デバイスが位置情報を使用して現在のタイムゾーンを特定できるようにします。
Android 12 で導入された location_time_zone_manager
サービスはシステム サーバーで実行され、time_zone_detector
サービスに位置情報のアルゴリズムの提案を送信するコードが含まれています。詳細については、位置情報によるタイムゾーン検出をご覧ください。
機能の導入に関する考慮事項
ここでは、デバイス メーカーがデバイスにこの機能を採用するかどうかを判断する際に役立つ、位置情報によるタイムゾーン検出機能の性質について説明します。
テレフォニーによる検出と位置情報による検出の比較
次の表は、タイムゾーンの検出にテレフォニー信号ではなく位置情報を使用した場合のメリットとデメリットを比較したものです。
テレフォニーによる検出 | 位置情報による検出 | |
---|---|---|
正確性 | 国によって異なります。 MCC、NITZ の正確性と提供状況によって異なります。 |
機能の設定やプラグインのコンポーネントによって異なります。 正確性は通常、次の要因で違ってきます。
|
更新可能性 | テレフォニーによる検出は、更新可能な Time Zone Data モジュール(com.android.tzdata APEX)に含まれるファイルに依存します。 | 機能の設定やプラグインのコンポーネントによって異なります。 更新可能性は通常、デバイスがサーバーとクライアントのどちらのタイムゾーン マップデータを使用するかによって異なります。 注: タイムゾーン マップデータは、Android の TZDB とその他のタイムゾーン情報の更新に使用される Time Zone Data モジュールには含まれません。 また、デバイス メーカーは、タイムゾーン ルールとタイムゾーン マップデータのバージョンの整合性も考慮する必要があります。 |
電力消費量 | ゼロか少ない | ユーザーの位置情報の設定、使用されているプラグインに加えて、通常は位置情報を要求する他のアプリによっても異なります。 |
可用性 | テレフォニー デバイスのみ。通常は正常な SIM が必要です。 | 位置情報による検出は、利用可能な位置情報プロバイダによって異なります。 |
ユーザーのプライバシー
通常、ユーザーに好まれるタイムゾーンは、ユーザーの地理的位置によって決まります。位置情報はセンシティブ データです。ユーザーは、タイムゾーンの検出の一環として位置情報が共有されているかどうかに関心があります。タイムゾーンの検出とは無関係に、デバイスで動作しているすべてのアプリは、Android の権限を必要とせずにデバイスの現在のタイムゾーンを読み取ることができます。そして、アプリはこの情報からデバイスの現在位置を不正確ながら推測できます。
さらに具体的には、タイムゾーンの検出には受動的手段と能動的手段があります。
- 受動的手段: デバイスの環境内のどこかから、その環境で使用するタイムゾーンがデバイスに通知されます。
- 能動的手段: デバイスは、自身でタイムゾーンを割り出する必要があるため、ユーザーのプライバシー設定と同意に応じてデバイスの位置情報を取得します。その後、外部サービスと位置情報を共有できます。ユーザーのプライバシーと同意の詳細については、以下の説明をご覧ください。
テレフォニーのアルゴリズムを使うような受動的な検出では、ユーザーに対するプライバシーの追加の影響はありません。
位置情報のアルゴリズムを使うような能動的な検出では、デバイスの現在地を特定することになるため、ユーザーがそれに同意しない可能性があります。また、タイムゾーン ID を確定するためにネットワークで位置情報を送信することもあります。
タイムゾーン検出におけるユーザーのプライバシーに対する Android のアプローチでは、ユーザーはアクティブになると可能性があるアルゴリズムを個別に無効にできます。また、AOSP プラットフォームのコードでは、位置情報そのものを直接処理しません。位置情報の検出と、位置情報とタイムゾーン ID のマッピングは、デバイス メーカーが設定したプラグイン コンポーネントが行います。
ユーザーのプライバシーに関する機能の詳細については、位置情報によるタイムゾーン検出をご覧ください。
設定
デバイス メーカーは、time_zone_detector
サービスが動作を変更するように設定できます。このセクションでは、time_zone_detector
サービスの一般的な動作に関する設定オプションについて説明します。テレフォニーおよびタイムゾーン検出アルゴリズムの設定の詳細については、テレフォニーによるタイムゾーン検出と位置情報によるタイムゾーン検出をご覧ください。
基本 AOSP 設定は frameworks/base/core/res/res/values/config.xml
にあります。
設定キー | AOSP 値 | 説明 |
---|---|---|
config_supportTelephonyTimeZoneFallback |
true |
true のとき、time_zone_detector はテレフォニー フォールバック モードを使用します。これは Android 13 以降で利用可能です。
|
デバイスのデフォルト動作を変更する
AOSP では、デフォルトでタイムゾーンの自動検出が有効となり、auto_time_zone
設定が true
に設定されます。デフォルトでタイムゾーンの自動検出を無効にするには、frameworks/base/packages/SettingsProvider/res/values/defaults.xml
で定義された def_auto_time_zone
の値を false
に設定します。
別のデバイスからのバックアップを復元する場合は、フレームワークがデフォルトで auto_time_zone
設定の値を更新します。バックアップからこの設定が復元されないようにするには、frameworks/base/packages/SettingsProvider/res/values/blocked_settings.xml
で定義された restore_blocked_global_settings
配列に auto_time_zone
を含めます。
タイムゾーンのデバッグとテスト
このセクションでは、time_zone_detector
サービスとすべてのアルゴリズムで共有される他のコンポーネントの動作のデバッグとテストを行う方法について説明します。
device_config サービスを使用したデバイスの設定
device_config
サービスは、通常は独自の(AOSP 以外の)コードによってリモート サーバーから取得される値を使用して、変更可能な動作の設定を行うために Android で使用される仕組みです。テストに device_config
の値を使用するとき(特に長時間にわたる手動テストの場合)、デバイスがフラグを同期することがあります。これにより、フラグがリセットされて、テストのために設定した値がクリアされる可能性があります。
Android 12 以降でフラグの同期を一時的に停止するには、次のコマンドを使用します。
adb shell cmd device_config set_sync_disabled_for_tests persistent
テスト後にフラグの同期を元に戻すには、次のコマンドを使用します。
adb shell cmd device_config set_sync_disabled_for_tests none
フラグの同期を元に戻したら、デバイスを再起動します。
詳細については、$ adb shell cmd device_config help
を使用してください。
time_zone_detector サービスを操作する
time_zone_detector
の設定と time_zone_detector
サービスの状態を表示するには、次のコマンドを使用します。
adb shell cmd time_zone_detector dump
タイムゾーン検出のデバッグとテストを行うためのその他のコマンドを確認するには、次のコマンドを使用します。
adb shell cmd time_zone_detector help
ヘルプ出力には、テスト用と製品版の time_zone_detector
サービスの動作に影響を与える device_config
サービス プロパティについても説明されています。詳細については、device_config サービスを使用したデバイスの設定をご覧ください。
タイムゾーンの検出を検証するには、テスターが time_zone_detector
で使用されているアルゴリズムを認識している必要があります。time_zone_detector
の現在のアルゴリズムを把握し、これに影響を与えるには、次のいずれかを行います。
- 設定 UI で視覚的に確認します。詳しくは、タイムゾーンの設定をご覧ください。
adb でコマンドラインを使用します。
time_zone_detector
の状態をダンプするには、adb shell cmd time_zone_detector dump
を使用します。- デバイスの設定を変更するには、
time_zone_detector
の他のコマンドを使用します。詳細については、adb shell cmd time_zone_detector help
を使用してください。
以下に adb shell cmd
time_zone_detector dump
コマンドからの出力例を示します。現在のアルゴリズムとサービスの状態に関する情報を太字にしています。
$ adb shell cmd time_zone_detector dump
TimeZoneDetectorStrategy:
mEnvironment.getCurrentUserId()=0
mEnvironment.getConfiguration(currentUserId)=ConfigurationInternal{mUserId=0, mUserConfigAllowed=true, mTelephonyDetectionSupported=true, mGeoDetectionSupported=true, mAutoDetectionEnabled=true, mLocationEnabled=true, mGeoDetectionEnabled=true}
[Capabilities=TimeZoneCapabilitiesAndConfig{mCapabilities=TimeZoneDetectorCapabilities{mUserHandle=UserHandle{0}, mConfigureAutoDetectionEnabledCapability=40, mConfigureGeoDetectionEnabledCapability=40, mSuggestManualTimeZoneCapability=30}, mConfiguration=TimeZoneConfiguration{mBundle=Bundle[{geoDetectionEnabled=true, autoDetectionEnabled=true}]}}]
mEnvironment.isDeviceTimeZoneInitialized()=true
mEnvironment.getDeviceTimeZone()=Europe/London
Time zone change log:
Manual suggestion history:
...
Geolocation suggestion history:
...
Telephony suggestion history:
...
この情報は以下のように解釈できます。
キー | 値 |
---|---|
mUserConfigAllowed |
Device Policy Controller によって、ユーザーによる日時設定の制御を禁止するかどうか。 |
mTelephonyDetectionSupported |
デバイスにテレフォニーによるタイムゾーン検出の機能があるかどうか。 |
mGeoDetectionSupported |
デバイスに位置情報によるタイムゾーン検出の機能があるかどうか。これは設定と少なくとも 1 つの LTZP が存在することに基づいた実効的な状態です。 |
mAutoDetectionEnabled |
タイムゾーンの自動検出が有効かどうか。 |
mLocationEnabled |
メインの場所の切り替え。 |
mGeoDetectionEnabled |
アルゴリズムの切り替え: false はテレフォニー アルゴリズム、true は位置情報アルゴリズムを示します。 |
提案の履歴情報は設定から行われた提案(手動)と、テレフォニーのアルゴリズムと位置情報のアルゴリズムで行われた提案を示しています。