自動車ユーザー エクスペリエンス制限

先に進む前に、ドライバーの注意散漫に関するガイドラインをご覧ください。

この記事では、複数の UX 制限ルール設定(EU と日本など)を作成し、実行時に適用する一連のルールを決定するために使用できる、自動車ユーザー エクスペリエンス(UX)の制限ルールについて説明します。詳しくは、CarUxRestrictions をご覧ください。

デベロッパーは、自動車 UX 制限サービスを使用して、新しい自動車 UX 制限設定を定義できます。デベロッパーがこの制限ルールを変更する場合(ローカルの安全性基準を遵守する場合など)、デベロッパーは API を使用して新しい設定を定義できます。

設定を指定する API は新しい設定でのみ保持されます。つまり、この設定はすぐには有効になりません。代わりに、UX 制限サービスが再起動し、かつシフトレバーがパーキングに入っている場合に、新しい設定が読み込まれます。 車のサービスは、新しい設定を再読み込みする前に、車がパーキング状態であることを確認します。

新しい UX 制限サービスのメソッドに加えて、設定を構築するための API も提供されています。ギアの選択と速度は、次に示す 3 つの運転状態のいずれかに変換されます。

  • パーキング。ギアがパーキングに入っています。
  • アイドリング。ギアがパーキングに入っておらず、速度はゼロです。
  • 走行中。ギアがパーキングに入っておらず、速度がゼロではありません。

アプリが自動車の運転状態とそれに対応する UX 制限を利用する方法については、運転状態と UX 制限の利用をご覧ください。

運転状態に基づく制限設定

ドライバーの注意散漫を防ぐため、Android は運転状態を一連の UX 制限(UX 制限)ルールにマッピングします(制限のリストについては、attrs.xml をご覧ください)。次のサンプルルールを考えてみましょう。

  • パーキング。無制限です。
  • アイドリング。動画も設定画面もありません。
  • 走行中。完全に制限されています(すべての制限が適用されます)。

上に示したマッピングは事前に決定され、XML リソースとして設定されます。設定は car_ux_restrictions_map に記録されます。内部的には、CarUxRestrictionsManagerService は初期化中にルールを解析し、メモリにルールを保存します。サービスはその後、現在の運転状態を UX 制限にマッピングし、現在の制限をシステム全体にブロードキャストします。

<!-- No restrictions when car is parked -->
<DrivingState car:state="parked">
    <Restrictions car:requiresDistractionOptimization="false"
                  car:uxr="baseline"/>
</DrivingState>

<!-- Restrictions when car is idling -->
<DrivingState car:state="idling">
    <Restrictions car:requiresDistractionOptimization="true"
                  car:uxr="no_video|no_config"/>
</DrivingState>

<!-- Restrictions for speed >= 0 m/s -->
<DrivingState car:state="moving" car:minSpeed="0.0">
    <Restrictions car:requiresDistractionOptimization="true"
                  car:uxr="fully_restricted"/>
</DrivingState>

複数のディスプレイの設定

デフォルトでは、追加ディスプレイに制限は適用されません。複数のディスプレイの制限設定を作成するには、そのディスプレイの物理ポートを指定した RestrictionMapping タグを含めます。各ディスプレイには適切な制限が自動的に適用されます。次の例では、物理ポート ID 1 と ID 2 のディスプレイに、それぞれ異なる設定がされています。

<RestrictionMapping car:physicalPort="1">
       <DrivingState car:state="moving">
           <Restrictions car:requiresDistractionOptimization="true" car:uxr="no_keyboard|no_video"/>
       </DrivingState>
   </RestrictionMapping>

   <RestrictionMapping car:physicalPort="2">
       <DrivingState car:state="moving">
           <Restrictions car:requiresDistractionOptimization="true" car:uxr="no_video"/>
       </DrivingState>
  </RestrictionMapping>

制限モードの設定

モードの名前(teen など)を選択できるようになりました。次の例では、default モードと passenger モードで異なる制限が設定されています(以前は passenger モードのみサポートされていました)。

<DrivingState car:state="idling">
    <Restrictions car:mode="passenger" car:requiresDistractionOptimization="false" car:uxr="baseline"/>
    <Restrictions car:requiresDistractionOptimization="true" car:uxr="no_video"/>
</DrivingState>
</Restrictions>
API を使用すると、モードに任意の文字列を設定できます。たとえば、CarUxRestrictionsManager の setRestrictionMode(@NonNull String mode) メソッドです (以前は、CarUxRestrictionsManager の setRestrictionMode(@CarUxRestrictionsManager.UxRestrictionMode int mode) メソッドを使用していました)。

CarUxRestrictionsConfiguration API

CarUxRestrictionsConfiguration による制限

新しいクラス CarUxRestrictionsConfiguration は、現在の XML 設定スキーマに 1:1 でマッピングされます。CarUxRestrictionsConfiguration は、CarUxRestrictions.Builder を使用して構築できます。これを使用すると、build() 時に設定が検証されます。

new CarUxRestrictionsConfiguration.Builder()
        // Explicitly set restrictions for each driving state.
        .setUxRestrictions(CarDrivingStateEvent.DRIVING_STATE_PARKED,
                /* requiresOptimization= */ false,
                /* restrictions= */ UX_RESTRICTIONS_BASELINE)
        .setUxRestrictions(CarDrivingStateEvent.DRIVING_STATE_IDLING,
                true,
                UX_RESTRICTIONS_NO_VIDEO|UX_RESTRICTIONS_NO_SETUP)
        .setUxRestrictions(CarDrivingStateEvent.DRIVING_STATE_MOVING,
                true,
                UX_RESTRICTIONS_FULLY_RESTRICTED)
        // Set restriction parameters.
        .setMaxStringLength(int max)
        .setMaxCumulativeContentItems(int max)
        .setMaxContentDepth(int max)
        // Build a new CarUxRestrictionsConfiguration.
        .build();

CarUxRestrictionsManager API

CarUxRestrictionsManager で次のドライブの CarUxRestrictionsConfiguration を設定します。このメソッドには、Car.PERMISSION_CAR_UX_RESTRICTIONS_CONFIGURATION 権限が必要です。

public synchronized boolean saveUxRestrictionsConfigurationForNextBoot(
        CarUxRestrictionsConfiguration config);

新しい UX 制限設定を維持する

新しい設定が渡されると、UX 制限サービスは新しい設定が正常に保存されたかどうかを示すブール値を返します。この新しい設定は、統合ヘッドユニット(IHU)が再起動し、かつシフトレバーがパーキングに入っている場合にのみ、使用されます。内部的には、UX 制限サービスには 2 つの設定セットが含まれます。

  • 本番環境。オプションですが、通常はこの設定が使用されます。UX 制限サービスは、起動時にこの設定を読み取ります。
  • ステージ。この設定もオプションですが、UX 制限に影響せず、車のサービスの開始時とパーキング状態の場合には本番環境の設定に昇格されます。

本番環境用の設定

図 1. 本番環境用の設定

アドレスエラー

CarPropertyManager から運転状態の情報を受け取るまで(起動時など)、UX 制限は適用されません。システムは、運転状態がパーキングであるかのように動作します。

保存した設定の読み取りに失敗した場合(SettingNotFoundException の結果など)、UX 制限サービスはハードコードされた完全に制限付きのモードにフォールバックされます。

// Idling/moving state is fully restricted.
private static CarUxRestrictionsConfiguration generateDefaultConfig() {}

運転状態とユーザーの制限

次の設計図ではインタラクションを示します。

運転状態のインタラクション

図 2. 運転状態のインタラクション

運転状態の取得に使用されるプロパティ

次の 3 つの VehiclePropertyIds を使用して、運転状態を取得します。

アプリで使用できる API

コードは次の場所にあります。

コード 場所
CarUxRestrictionsManager
UX 制限の変更を登録するための公開 API。
/packages/services/Car/+/master/car-lib/src/android/car/drivingstate/CarUxRestrictionsManager.java
CarUxRestrictions
UX の制限事項の定義。
/packages/services/Car/+/master/car-lib/src/android/car/drivingstate/CarUxRestrictions.java
CarDrivingStateManager
運転状態の変更を登録するためのシステム API。
/packages/services/Car/+/master/car-lib/src/android/car/drivingstate/CarDrivingStateManager.java

運転状態をシミュレートするには、テストをご覧ください。