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 イベント
次の表に示すように、KeyEvent タイプを生成するボタンに TV UI の動作を割り当てます。
KeyEvent | 行動 |
|---|---|
KEYCODE_BUTTON_B、KEYCODE_BACK | 戻る |
KEYCODE_BUTTON_SELECT、KEYCODE_BUTTON_A、KEYCODE_ENTER、KEYCODE_DPAD_CENTER、 KEYCODE_NUMPAD_ENTER | 選択 |
KEYCODE_DPAD_UP、KEYCODE_DPAD_DOWN、KEYCODE_DPAD_LEFT、
KEYCODE_DPAD_RIGHT | ナビゲーション |
メディア イベント
ユーザーがメディアを視聴している場合は、次の表に示すように、KeyEvent
タイプを生成するボタンに動作を割り当てます。アプリが
MediaSessionを制御している場合は、
MediaControllerAdapter
を使用して、表に示すMediaControllerCompat.TransportControls
メソッドのいずれかを呼び出します。このコンテキストでは、選択ボタンは再生ボタンまたは一時停止
ボタンとして機能します。
KeyEvent | TransportControls 呼び出し | 行動 |
|---|---|---|
BUTTON_SELECT、BUTTON_A、ENTER、
DPAD_CENTER、KEYCODE_NUMPAD_ENTER |
play() | Google Play |
BUTTON_START、BUTTON_SELECT、BUTTON_A、
ENTER、DPAD_CENTER、KEYCODE_NUMPAD_ENTER |
pause() | 一時停止 |
BUTTON_R1 | skipToNext() | 次へスキップ |
BUTTON_L1 | skipToPrevious() | 前へスキップ |
DPAD_RIGHT、BUTTON_R2、AXIS_RTRIGGER、
AXIS_THROTTLE | fastForward() | 早送り |
DPAD_LEFT、BUTTON_L2、AXIS_LTRIGGER、
AXIS_BRAKE | rewind() | 巻き戻し |
| なし | stop() | 停止 |
注: MediaSession を使用する場合は、
`KEYCODE_MEDIA_PLAY` や `KEYCODE_MEDIA_PAUSE` などの
KEYCODE_MEDIA_PLAYメディア固有のボタンの処理をKEYCODE_MEDIA_PAUSEオーバーライドしないでください。
システムは適切な
MediaSession.Callback
メソッドを自動的にトリガーします。
戻るボタンの適切な動作を指定する
戻るボタンは、トグルとして機能しないようにしてください。たとえば、メニューを開閉する両方の操作に 使用しないでください。戻るボタンは、パンくずリストの後方、つまりプレーヤーが前に見た画面に移動するだけに使用します。
戻るボタンは直線的な後方ナビゲーションのみを行うため、 戻るボタンを使用して別のボタンで開いたアプリ内メニューを離れ、アプリに戻ることができます。 戻るボタンを連続して押すと、最終的に Android TV のホーム画面に移動する必要があります。 例: ゲームプレイ > ゲームの一時停止画面 > ゲームのメイン画面 > Android TV のホーム画面、または テレビ番組の再生 > TV アプリのメイン画面 > Android TV のホーム画面。
ナビゲーションの設計について詳しくは、 [戻る] ナビゲーションとアップ ナビゲーションの設計をご覧ください。実装について詳しくは、 適切な「戻る」ナビゲーションを提供するをご覧ください。
ゲームのコントローラを処理する
D-pad 操作をサポートする
D-pad 操作を中心にコントロール方式を計画します。このコントロール セットが Android TV デバイスのデフォルトであるためです。プレーヤーは、主要なゲームプレイの操作だけでなく、メニューや広告の選択など、ゲームのあらゆる場面で D-pad を使える必要があります。このような理由から、 「タップして続行」などの表現で Android TV ゲームがタッチ インターフェースに言及しないようにしてください。
プレーヤーがコントローラを操作する方法は、優れたユーザー エクスペリエンスを実現するための鍵となります。次のベスト プラクティスを検討してください。
- 事前にコントローラの要件を伝える: Google Play の説明 を使用して、コントローラについて想定されることをすべてプレーヤーに伝えます。D-pad のみのゲームパッドよりもジョイスティックがあるゲームパッドに適したゲームの場合は、 その点も明記します。ゲームに適さないコントローラを使用しているプレーヤーは、ユーザー エクスペリエンスが標準以下となり、ゲームを低く評価する可能性があります。
- 一貫したボタン マッピングを使用する: 直感的なボタン マッピングは、優れたユーザー エクスペリエンスを実現するための鍵となります。 たとえば、「同意する」には A ボタン、「キャンセル」には B ボタンを使用して、一般的に受け入れられている習慣に沿う必要があります。 また、ボタンを再マッピングできるようにして柔軟性 を提供することもできます。ボタン マッピングについて詳しくは、コントローラの操作を処理するをご覧ください。
- コントローラの機能を検出し、必要に応じて調整する: コントローラとゲームのマッチングを最適化するために、コントローラの機能をクエリします。たとえば、 プレーヤーがコントローラを振ることでオブジェクトを操縦できるようにしたいとします。 しかし、 プレーヤーのコントローラに加速度計やジャイロスコープのハードウェアがない場合、コントローラを振っても操作できません。 コントローラにクエリを実行し、モーション検知(機能)がサポートされていない場合は、代替の利用可能なコントロール方式に切り替えます。コントローラの機能のクエリについて詳しくは、複数の Android バージョンにまたがってコントローラをサポートするをご覧ください。
適切なボタンを使用する
ゲーム コントローラの中には、スタートボタン、検索ボタン、メニューボタンがないものもあります。UI がこれらのボタンの使用に依存しないようにしてください。
複数のコントローラを処理する
複数のプレーヤーがそれぞれのコントローラで 1 つのゲームをプレイしている場合は、それぞれのプレーヤーとコントローラのペアをマッピングすることが重要です。
コントローラ番号
の識別を実装する方法については、
getControllerNumber()をご覧ください。
コントローラの接続解除を処理する
ゲームプレイの途中でコントローラの接続が解除されると、ゲームを一時停止し、接続解除されたプレーヤーにコントローラの再接続を求めるダイアログを 表示します。
また、ダイアログにトラブルシューティングのヒントを表示します。たとえば、プレーヤーに「Bluetooth 接続を確認してください」と伝えます。入力デバイスのサポートの実装について詳しくは、コントローラの操作を処理するとBluetooth の概要をご覧ください。
コントローラの操作説明を表示する
ゲームで視覚的にゲームの操作説明を行う場合、a コントローラの画像はブランド名がなく、Android と互換性のあるボタンのみを持つものにする必要があります。
Android 互換コントローラのサンプル画像については、 Android TV ゲームパッド テンプレート(ZIP)をダウンロードしてください。 黒い背景にある白いコントローラと、白い背景にある黒いコントローラ(図 1 を参照)が、PNG ファイルと Adobe® Illustrator® ファイルとして含まれています。