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

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

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

D-pad の最低限の操作

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

TV デバイスの D-pad コントローラによるナビゲーションの処理について詳しくは、TV のナビゲーションをご覧ください。

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

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

  • 数分間の動画の再生中に、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 フレームワークによって再起動されるのではなく、再接続イベントを通じて実行を継続できます。この場合、ユーザー エクスペリエンスは良くありません。

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

テレビデバイスのユーザーは、複数のタイプのコントローラをテレビで使用することがあります。たとえば、基本的な 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 操作をサポートする

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

優れたユーザー エクスペリエンスを実現するには、コントローラの操作方法が重要になります。次のおすすめの方法を考慮してください。

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

適切なボタンを使用する

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

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

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

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

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

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

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

ゲームに視覚的なゲーム操作手順を提供する場合は、ブランド表示のないコントローラ画像を使用し、Android 対応のボタンのみを含めます。

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

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