TV コントローラを管理する

TV デバイスには、基本的な形状のリモート コントローラまたはゲーム コントローラなど、アプリを操作するためのセカンダリ ハードウェア デバイスが必要です。つまり、アプリは D-pad による入力をサポートしている必要があります。また、コントローラのオフラインや、複数タイプのコントローラからの入力を処理する必要があることもあります。

このレッスンでは、TV デバイス用のコントローラに対応するための要件について説明します。

D-pad の最低限の操作

TV デバイスのデフォルトのコントローラは D-pad です。一般的に、アプリは、上、下、左、右、選択、戻る、ホームの各ボタンのみを持つリモート コントローラから操作できるようにする必要があります。その他の操作ボタンを持つゲーム コントローラを一般的に必要とするゲームアプリの場合、こうした D-pad 操作によるゲームプレイが可能になるように試行することが求められます。またこの場合、アプリではコントローラが必要であることをユーザーに警告し、D-pad コントローラを使ってゲームを正常に終了できるようにする必要があります。TV デバイス用の D-pad コントローラを使用したナビゲーションの処理について詳しくは、TV 用のナビゲーションを作成するをご覧ください。

コントローラの接続解除を処理する

TV 用のコントローラは、多くの場合 Bluetooth デバイスであり、定期的にスリープモードに入って TV デバイスから接続を解除することで、電力を節約しようとします。つまり、こうした再接続イベントを処理するように設定されていない場合は、アプリが中断または再起動される場合があります。こうしたイベントは、以下のいずれかの状況で発生します。

  • 数分間の動画の視聴中に、D-Pad またはゲーム コントローラがスリープモードになり、TV デバイスから接続が解除され、その後再接続する場合。
  • ゲームプレイ中、新しいプレーヤーが、現在接続されていないゲーム コントローラを使用してゲームに参加する場合。
  • ゲームプレイ中、プレーヤーがゲームを離れ、ゲーム コントローラの接続が解除された場合。

接続解除イベントと再接続イベントの対象となる TV アプリのアクティビティは、アプリ マニフェストで再接続イベントを処理するように設定する必要があります。次のコードサンプルは、キーボードやナビゲーション デバイスの接続、接続解除、再接続を含め、構成の変更を処理するアクティビティを有効にする方法を示しています。

    <activity
      android:name="com.example.android.TvActivity"
      android:label="@string/app_name"
      android:configChanges="keyboard|keyboardHidden|navigation"
      android:theme="@style/Theme.Leanback">

      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LEANBACK_LAUNCHER" />
      </intent-filter>
      ...
    </activity>
    

この設定の変更により、アプリは Android フレームワークによって再起動されるのではなく、再接続イベントを介して実行し続けられるようになります。Android フレームワークによる再起動はユーザー エクスペリエンスの低下を招きます。

さまざまな D-pad 入力を処理する

TV デバイスのユーザーは、TV で使用するコントローラを複数タイプ持っている場合があります。たとえば、ユーザーは基本的な D-pad コントローラとゲーム コントローラの両方を持っている可能性があります。ゲーム コントローラが D-pad 機能のために使用される場合、そのコントローラによって提供されるキーコードは、実際の D-pad によって送信されるキーコードとは異なる場合があります。

ユーザーがアプリを操作するコントローラを物理的に切り替える必要性を排除するため、アプリはゲーム コントローラからのさまざまな D-pad 入力を処理する必要があります。こうしたさまざまな入力の処理について詳しくは、コントローラの操作を処理するをご覧ください。

ボタンイベントを処理する

ユーザーがコントローラのボタンを押すと、アプリは KeyEvent を含むイベントを受け取ります。ボタンに対して想定される動作には、メディア イベント(再生、一時停止、停止など)や、TV タイプ イベント(選択やナビゲーションなど)があります。優れたユーザー エクスペリエンスを提供するため、アプリはコントローラのボタンに一貫した動作を割り当てる必要があります。

TV UI イベント

次の KeyEvents を生成するボタンは、以下の表のようにアプリで処理される必要があります。

KeyEvent動作
BUTTON_B、BACK戻る
BUTTON_SELECT、BUTTON_A、ENTER、DPAD_CENTER、KEYCODE_NUMPAD_ENTER選択
DPAD_UP、DPAD_DOWN、DPAD_LEFT、DPAD_RIGHTナビゲーション

メディア イベント

ユーザーがメディアを視聴している場合、次の KeyEvents を生成するボタンは、以下の表のようにアプリで処理される必要があります。アプリが MediaSession を制御している場合、MediaControllerAdapter を使用して、以下に示すように MediaControllerCompat.TransportControls メソッドのいずれかを呼び出す必要があります。この場合、選択ボタンは再生 / 一時停止ボタンとして機能します。

KeyEventTransportControls 呼び出し動作
BUTTON_SELECT、BUTTON_A、ENTER、DPAD_CENTER、KEYCODE_NUMPAD_ENTERpause()再生
BUTTON_START、BUTTON_SELECT、BUTTON_A、ENTER、DPAD_CENTER、KEYCODE_NUMPAD_ENTERpause()一時停止
BUTTON_R1skipToNext()次へスキップ
BUTTON_L1skipToPrevious()前へスキップ
DPAD_RIGHT、BUTTON_R2、AXIS_RTRIGGER、AXIS_THROTTLEfastForward()早送り
DPAD_LEFT、BUTTON_L2、AXIS_LTRIGGER、AXIS_BRAKErewind()巻き戻し
(停止に関連付けられている KeyEvent はありません)stop()停止

ゲームのコントローラを処理する

D-pad 操作をサポートする

十字キー(D-pad)操作を中心にコントロール方式を計画します。このコントロール セットが Android TV デバイスのデフォルトであるためです。プレーヤーは、主要なゲームプレイの操作だけでなく、メニューや広告の選択など、ゲームのあらゆる場面で D-Pad を使える必要があります。このような理由から、Android TV 用ゲームではタッチ インターフェースについて言及しないようにする必要もあります。たとえば、「続けるにはここをタップ」という表示は Android TV 用ゲームでは適切ではありません。

優れたユーザー エクスペリエンスを実現するには、プレーヤーのコントローラ操作をどのように構成するかが重要です。

  • 事前にコントローラの要件を伝える。Google Play の説明を使用して、コントローラについて想定されることをすべてプレーヤーに伝えます。D-pad のみのゲームパッドよりもジョイスティックがあるゲームパッドに適したゲームの場合は、その点も明記します。ゲームに適さないコントローラを使用しているプレーヤーは、ユーザー エクスペリエンスが標準以下となり、ゲームを低く評価する可能性があります。
  • 一貫したボタン マッピングを使用する。優れたユーザー エクスペリエンスを実現するには、直感的で柔軟なボタン マッピングが重要です。たとえば、「同意する」には A ボタン、「キャンセルする」には B ボタンを使用して、一般的に受け入れられている習慣に沿う必要があります。また、ボタンを再マッピングできるようにして柔軟性を提供することもできます。ボタン マッピングについて詳しくは、コントローラの操作を処理するをご覧ください。
  • コントローラの機能を検出し、必要に応じて調整する。コントローラとゲームのマッチングを最適化するために、コントローラの機能をクエリします。たとえば、プレーヤーがコントローラを振ることでオブジェクトを操縦できるようにしたいとします。しかし、プレーヤーのコントローラに加速度計やジャイロスコープのハードウェアがない場合、コントローラを振っても操作できません。そこで、ゲームでコントローラにクエリを実行し、モーション検出がサポートされていない場合は、代替の利用可能なコントロール方式に切り替えます。コントローラの機能のクエリについて詳しくは、複数の Android バージョンにまたがってコントローラをサポートするをご覧ください。

戻るボタンの適切な動作を指定する

戻るボタンは、トグルとして機能しないようにしてください。たとえば、メニューの開閉には使用しないでください。戻るボタンは、ゲームプレイ > ゲームの一時停止画面 > ゲームのメイン画面 > Android のホーム画面のように、パンくずリストの後方、つまりプレーヤーが前に見た画面に移動するだけにする必要があります。

戻るボタンは直線的な(後方の)ナビゲーションのみを行うため、戻るボタンを使用してゲーム内メニュー(別のボタンで開いたメニュー)を離れ、ゲームプレイに戻ることができます。ナビゲーションの設計について詳しくは、「戻る」ボタンと「上へ」ボタンを使用したナビゲーションをご覧ください。実装について詳しくは、適切な「戻る」ナビゲーションを提供するをご覧ください。

適切なボタンを使用する

ゲーム コントローラの中には、スタートボタン、検索ボタン、メニューボタンがないものもあります。UI は、これらのボタンの使用に依存しないようにしてください。

複数のコントローラを処理する

複数のプレーヤーがそれぞれのコントローラで 1 つのゲームをプレイしている場合は、それぞれのプレーヤーとコントローラのペアをマッピングすることが重要です。コントローラ番号の識別を実装する方法については、getControllerNumber() をご覧ください。

コントローラの接続解除を処理する

ゲームプレイの途中でコントローラの接続が解除されると、ゲームが一時停止し、接続解除されたプレーヤーにコントローラの再接続を求めるダイアログが表示されます。

このダイアログには、トラブルシューティングのヒントも表示する必要があります(たとえば、プレーヤーに「Bluetooth 接続を確認してください」と伝えるポップアップ ダイアログなど)。入力デバイスのサポートの実装について詳しくは、コントローラの操作を処理するをご覧ください。Bluetooth 接続について詳しくは、Bluetooth をご覧ください。

コントローラの操作説明を表示する

ゲームで視覚的にゲームの操作説明を行う場合、コントローラの画像はブランド名がなく、Android と互換性のあるボタンのみを持つものにする必要があります。

Android 互換コントローラのサンプル画像については、Android TV ゲームパッド テンプレート(ZIP)をダウンロードしてください。黒い背景にある白いコントローラと、白い背景にある黒いコントローラ(図 1 を参照)が、PNG ファイルと Adobe® Illustrator® ファイルとして含まれています。

図 1. Android TV ゲームパッド テンプレート(ZIP)を使用したコントローラの操作説明の例