先に進む前に、ドライバーの注意散漫に関するガイドラインをご覧ください。
この記事では、複数の 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.
を使用して構築できます。これを使用すると、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
コードは次の場所にあります。
運転状態をシミュレートするには、テストをご覧ください。