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 入力を処理する

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 操作をサポートする

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 ゲームパッド テンプレート(ZIP)をダウンロードしてください。図 1 に示すように、黒の背景に白のコントローラ、白の背景の上に黒のコントローラが PNG ファイルと Adobe® Illustrator® ファイルとして含まれています。

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