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

TV デバイスには、アプリを操作するためのセカンダリ ハードウェア デバイス(基本的なリモコンまたはゲーム コントローラ)が必要です。そのため、アプリは十字キー(D-pad)による入力をサポートする必要があります。 また、アプリはコントローラのオフラインや、複数のタイプのコントローラからの入力を処理しなければならない場合があります。

このガイドでは、TV デバイスのコントローラを処理するための要件について説明します。

D-pad の最低限の操作

TV デバイスのデフォルトのコントローラは D-pad です。一般に、アプリは、上下、左、右、選択、戻る、ホームの各ボタンのみを備えたリモコンから操作できる必要があります。アプリが通常は追加のコントロールを備えたゲーム コントローラを必要とするゲームの場合は、これらの D-pad コントロールのみでゲームプレイをサポートするようにします。それ以外の場合は、コントローラが必要であることをユーザーに警告し、ユーザーが D-pad コントローラを使用してゲームを正常に終了できるようにします。

TV デバイスの D-pad コントローラを使用したナビゲーションについて詳しくは、テレビのナビゲーションをご覧ください。

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

テレビ用のコントローラは多くの場合 Bluetooth デバイスですが、定期的にスリープモードに移行してテレビデバイスとの接続を切ることで電力を節約しようとすることがあります。つまり、アプリがこうした再接続イベントを処理するように構成されていない場合、アプリが中断または再起動される可能性があります。これらのイベントは、次のいずれかの状況で発生する可能性があります。

  • 数分の再生時間の動画が再生されている間に、D-pad またはゲーム コントローラがスリープモードになり、テレビデバイスとの接続を解除して、後で再接続する場合があります。
  • ゲームプレイ中、新しいプレーヤーが、まだ接続されていないゲーム コントローラを使用してゲームに参加する場合があります。
  • ゲームプレイ中、プレーヤーがゲームを離れ、ゲーム コントローラの接続を解除する場合があります。

切断イベントと再接続イベントの対象となる 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 フレームワークによってアプリが再起動される(ユーザー エクスペリエンスが低下する)代わりに、再接続イベントを通じてアプリの実行を継続できます。

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

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

ユーザーがアプリを操作するためにコントローラを切り替える必要がなくなるよう、D-pad による入力のバリエーションを処理します。入力のバリエーションの処理について詳しくは、 十字キーによる入力を処理するをご覧ください。

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

ユーザーがコントローラのボタンをクリックすると、アプリは KeyEvent を含むイベントを受け取ります。ボタンの意図する動作は、再生、一時停止、停止などのメディア イベントの場合もあれば、選択やナビゲーションなどのテレビタイプのイベントである場合もあります。優れたユーザー エクスペリエンスを提供するには、コントローラ ボタンに一貫した動作を割り当てます。

TV UI イベント

次の表に示すように、KeyEvent タイプを生成するボタンに TV UI の動作を割り当てます。

KeyEvent動作
KEYCODE_BUTTON_BKEYCODE_BACK裏面
KEYCODE_BUTTON_SELECTKEYCODE_BUTTON_AKEYCODE_ENTERKEYCODE_DPAD_CENTERKEYCODE_NUMPAD_ENTER選択
KEYCODE_DPAD_UPKEYCODE_DPAD_DOWNKEYCODE_DPAD_LEFTKEYCODE_DPAD_RIGHTナビゲーション

メディア イベント

ユーザーがメディアを視聴しているときに、次の表に示すように、KeyEvent タイプを生成するボタンに動作を割り当てます。アプリが MediaSession を制御している場合は、MediaControllerAdapter を使用して、表に示されている MediaControllerCompat.TransportControls メソッドのいずれかを呼び出します。このコンテキストでは、選択ボタンは [再生] ボタンまたは [一時停止] ボタンとして機能します。

KeyEventTransportControls 呼び出し動作
BUTTON_SELECTBUTTON_AENTERDPAD_CENTERKEYCODE_NUMPAD_ENTER play()再生
BUTTON_STARTBUTTON_SELECTBUTTON_AENTERDPAD_CENTERKEYCODE_NUMPAD_ENTER pause()一時停止
BUTTON_R1skipToNext()次へスキップ
BUTTON_L1skipToPrevious()前へスキップ
DPAD_RIGHTBUTTON_R2AXIS_RTRIGGERAXIS_THROTTLEfastForward()早送り
DPAD_LEFTBUTTON_L2AXIS_LTRIGGERAXIS_BRAKErewind()巻き戻し
なしstop()停止

注: MediaSession を使用する場合は、メディア固有のボタン(KEYCODE_MEDIA_PLAYKEYCODE_MEDIA_PAUSE など)の処理をオーバーライドしないでください。システムは適切な MediaSession.Callback メソッドを自動的にトリガーします。

[戻る] ボタンを適切に動作させる

[戻る] ボタンは切り替えボタンとしては機能しません。たとえば、メニューを開くためと閉じるためには使用しないでください。プレーヤーが操作していた前の画面から、パンくずリスト形式の戻る場合にのみ使用します。

[戻る] ボタンは直線的な後方ナビゲーションのみを実行するため、このボタンを使用すると、アプリ内メニューを別のボタンで開いたままにしてアプリに戻ることができます。[戻る] ボタンを連続して押すと、最終的に Android TV のホーム画面が表示される必要があります。 例: ゲームプレイ > ゲーム一時停止画面 > ゲームのメイン画面 > Android TV のホーム画面またはテレビ番組の再生 > TV アプリのメイン画面 > Android TV のホーム画面

ナビゲーションの設計について詳しくは、 「戻る」ナビゲーションと「上へ」ナビゲーションの設計をご覧ください。実装について詳しくは、適切な「戻る」ナビゲーションを提供するをご覧ください。

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

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

このコントロール セットは Android TV デバイスのデフォルトであるため、D-pad コントロールを中心に操作方法を計画します。プレーヤーは、主要なゲームプレイの操作だけでなく、メニューや広告の操作も、ゲームのあらゆる場面で D-pad を使用できる必要があります。そのため、Android TV ゲームで「続行するには、ここをタップして」のような言葉のタッチ インターフェースを参照しないようにしてください。

優れたユーザー エクスペリエンスを実現するためには、プレーヤーとコントローラの操作方法をどう決めるかが重要です。次のベスト プラクティスを検討してください。

  • コントローラの要件を事前に伝える: Google Play の説明を使用して、コントローラに対する期待をプレーヤーに伝えます。ゲームが D-pad のみのゲームパッドよりもジョイスティックのあるゲームパッドに適している場合は、この点を明確にします。プレーヤーがゲームに適さないコントローラを使用すると、ユーザー エクスペリエンスが損なわれ、ゲームの評価も下がる可能性があります。
  • 一貫性のあるボタン マッピングを使用する: 直感的なボタン マッピングは、優れたユーザー エクスペリエンスを実現するうえで重要です。たとえば、慣習を遵守するには、A ボタンを使用して承諾し、B ボタンを使用してキャンセルします。再マッピングという形で柔軟性を提供することもできます。ボタン マッピングの詳細については、コントローラの操作を処理するをご覧ください。
  • コントローラの機能を検出して、それに応じて調整する: コントローラの機能をクエリして、コントローラとゲームの間のマッチングを最適化します。たとえば、プレーヤーがコントローラを空中に振ってオブジェクトを操縦できるようにしても、プレーヤーのコントローラに加速度計とジャイロスコープのハードウェアがない場合、手を振ることはできません。コントローラをクエリし、モーション検出がサポートされていない場合は、使用可能な別の制御スキームに切り替えます。コントローラ機能のクエリについて詳しくは、Android バージョン間でのコントローラのサポートをご覧ください。

適切なボタンを使用する

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

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

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

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

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

また、ダイアログでトラブルシューティングのヒントを提示します。たとえば、プレーヤーに「Bluetooth 接続を確認してください」と指示します。入力デバイスのサポートの実装について詳しくは、コントローラの操作を処理するBluetooth の概要をご覧ください。

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

ゲームで視覚的なゲーム操作の手順を説明する場合は、ブランディングのないコントローラ イメージを使用し、Android と互換性のあるボタンのみを含めます。

Android 互換コントローラのサンプル画像については、Android TV Gamepad Template(ZIP)をダウンロードします。PNG ファイルと Adobe® Illustrator® ファイルとして、図 1 のように、黒い背景に白いコントローラがあり、白い背景に黒いコントローラが含まれています。

図 1. Android TV Gamepad テンプレートを使用したコントローラの手順の例。