OEM カスタム入力

OEM カスタム入力を使用すると、Android の標準以外の新しい機能の新しい自動車入力イベントを追加できます。標準以外の入力イベントは、既存の Android KeyEvent によってマッピングされません。これは汎用的であり、Android のサーフェスで動作するように設計されていますが、OEM 固有の機能を実装するように拡張されていません。たとえば、ハンドル コントロールにあるボタンを押すと、(インテントを介して)地図アプリが開き、自動車の現在地が表示されます。この機能を使用すると、ドライバーは運転中に注意をそらすことなく現在地を可視化できます。

この記事では、既存の Android KeyEvent を再利用して、機能を表す Android KeyEvent がない場合にのみ使用する CustomInputEvent を作成する方法について説明します。

HW_CUSTOM_INPUT

OEM カスタム入力は、HW_CUSTOM_INPUTCustomInputEvent.java で表されます。HW_CUSTOM_INPUT は、自動車のハードウェア(車両 HAL)によってインスタンス化されたネイティブ イベントです。OEM は、このイベントをインスタンス化する方法を決定します。HW_CUSTOM_INPUT へのアクセスは [read only]{:.external} に設定され、VehiclePropertyAccess:READ が使用されます。

車両 HAL で常に最新の利用可能な値をブロードキャストできるようにするため、HW_CUSTOM_INPUT 通知は ON_CHANGE に設定され、VehiclePropertyChangeMode:ON_CHANGE が使用されます。

HW_CUSTOM_INPUT 値は汎用的な int32 の配列で構成され、[global]{:.external} に設定されます(VehicleArea:GLOBAL を使用)。3 つの汎用整数は次のとおりです。

  1. 最初の要素は、OEM が定義する入力コードを表します。任意のセマンティックを入力コードに関連付けることができます。

  2. 2 つ目の要素には、メイン ディスプレイやクラスタなどのターゲット ディスプレイが格納されます。

  3. 3 つ目の要素には、イベントが繰り返された回数が含まれます。たとえば、ボタンが押された回数が示されます。

CustomInputEvent と Car Input API

InputHalService は、車両 HAL から着信した HW_CUSTOM_INPUT を受信する自動車サービスです。

InputHalService は着信した HW_CUSTOM_INPUTCustomInputEvent に変換します。これは、対応する aidl インターフェースとともに、car-lib/src/android/car/input にある Java parcelable クラスです。

コア自動車入力サービスである CarInputService は、着信した CustomInputEvent を受信すると、登録済みの Android システム サービスに送信します。

着信した CustomInputEvent を登録して受信するには、システム サービスが次のことを行う必要があります。

次の図は、OEM カスタム入力イベントのワークフローを示しています。

OEM カスタム入力ワークフロー

OEM Android システム サービス

OEM は、CarInputService から着信した CustomInputEvent を処理するための独自の Android システム サービスを提供しています。

android.permission.INJECT_EVENTS 権限でマークされたサービスのみが、Car Input API(CarInputManager)から CustomInputEvent の登録と受信を行えます。サードパーティのサービスまたはアプリは、この Android システム権限で署名することはできません(OEM サービスのみ)。 したがって、サードパーティのサービスまたはアプリが Car Input API に登録することはできません。

OEM Android システム サービスは、SystemApi とパブリック メソッドにアクセスできます。

リファレンス実装

サンプルとガイドラインとして提供されている packages/services/Car/tests/SampleCustomInputService のリファレンス実装をご覧ください。たとえば、ハンドル コントロールに新しいボタンを追加します。この新しいボタンを押すと、地図アプリが開き、自動車の現在地が表示されます。

この例では、OEM はこの新しい機能(地図アプリを開いて自動車の現在地を表示する)を表すために INPUT_CODE_F1(最初の CustomInputEvent 簡易関数)を選択しました。

このサービスは起動時に、requestInputEventCapture を介して CarInputManger に自身を登録します(リファレンス実装登録コードを参照)。

このサービスは、着信した CustomInputEvent を受信すると、地図アプリを開始するインテントを送信します。その方法については、CustomInputEventListener.java をご覧ください。