管理 TV 控制器

TV 设备需要通过基本遥控器或游戏控制器形式的辅助硬件设备与应用进行交互。因此,您的应用必须支持方向键 (D-pad) 输入。 此外,您的应用可能需要处理离线控制器以及来自多种控制器的输入。

本指南讨论了电视设备控制器的操作要求。

方向键基本控制按钮

TV 设备的默认控制器是方向键。一般来说,您的应用程序必须能够通过只有上、下、左、右、选择、返回和主页按钮的遥控器进行操作。如果您的应用是一款游戏,通常需要使用带有更多控制按钮的游戏控制器进行操作,请尝试仅通过这些方向键控制按钮来支持游戏操作。否则,请提醒用户需要使用控制器,并允许他们使用方向键控制器正常退出游戏。

如需详细了解如何使用方向键控制器在电视设备上进行导航,请参阅 TV 导航

处理控制器断开连接事件

电视控制器通常是蓝牙设备,这些设备可能会通过间歇性地进入休眠模式并断开与电视设备的连接来节省电能。这意味着,如果未将应用配置为处理这些重新连接事件,可能会导致应用中断或重新启动。以下任何一种情况下都可能发生这些事件:

  • 在播放几分钟长的视频时,方向键或游戏控制器可能会进入睡眠模式,与电视设备断开连接,稍后再重新连接。
  • 玩游戏时,新加入游戏的玩家所使用的游戏控制器可能尚未连接。
  • 在游戏过程中,玩家可能会离开游戏并断开游戏控制器的连接。

任何可能发生断开连接和重新连接事件的电视应用活动都必须在应用清单中配置为处理重新连接事件。以下代码示例演示了如何使 activity 能够处理配置变更,包括键盘或导航设备连接、断开连接或重新连接:

<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 框架重新启动,从而带来不好的用户体验。

处理方向键输入变化

电视设备用户可能有多种控制器与电视配合使用。例如,用户可能既有基本方向键控制器,又有游戏控制器。在用于执行方向键功能时,游戏控制器提供的键控代码可能不同于基本方向键发送的键控代码。

处理方向键输入变化,以便用户无需切换控制器就能操作您的应用。如需详细了解如何处理输入变化,请参阅 处理方向键输入

处理按钮事件

当用户点击控制器上的按钮时,您的应用会收到包含 KeyEvent 的事件。按钮的预期行为可能是媒体事件(如播放、暂停或停止),也可能是电视类型的事件(如选择或导航)。为了提供良好的用户体验,请为控制器按钮分配一致的行为。

TV 界面事件

为生成 KeyEvent 类型的按钮分配电视界面行为,如下表所示:

KeyEvent行为
KEYCODE_BUTTON_BKEYCODE_BACK返回
KEYCODE_BUTTON_SELECT, KEYCODE_BUTTON_A, KEYCODE_ENTER, KEYCODE_DPAD_CENTER, KEYCODE_NUMPAD_ENTER选择
KEYCODE_DPAD_UPKEYCODE_DPAD_DOWNKEYCODE_DPAD_LEFTKEYCODE_DPAD_RIGHT导航

媒体事件

当用户观看媒体内容时,请为生成 KeyEvent 类型的按钮分配行为,如下表所示。如果您的应用正在控制 MediaSession,请使用 MediaControllerAdapter 来调用表格中显示的某个 MediaControllerCompat.TransportControls 方法。请注意,在此上下文中,选择按钮将充当“播放”或“暂停”按钮。

KeyEventTransportControls 调用行为
BUTTON_SELECT, BUTTON_A, ENTER, DPAD_CENTER, KEYCODE_NUMPAD_ENTER play()播放
BUTTON_START, BUTTON_SELECT, BUTTON_A, ENTER, DPAD_CENTER, KEYCODE_NUMPAD_ENTER pause()暂停
BUTTON_R1skipToNext()跳到下一个
BUTTON_L1skipToPrevious()跳到上一个
DPAD_RIGHTBUTTON_R2AXIS_RTRIGGERAXIS_THROTTLEfastForward()快进
DPAD_LEFT, BUTTON_L2, AXIS_LTRIGGER, AXIS_BRAKErewind()快退
不适用stop()停止

注意:使用 MediaSession 时,请勿替换媒体专用按钮(例如 KEYCODE_MEDIA_PLAYKEYCODE_MEDIA_PAUSE)的处理方式。系统会自动触发相应的 MediaSession.Callback 方法。

提供适当的返回按钮行为

返回按钮绝不能用作切换功能。例如,不要用它来同时打开和关闭菜单。它应当仅用于通过面包屑导航方式返回到玩家之前所在的屏幕。

由于返回按钮只执行线性向后导航,因此您可以使用它来退出通过其他按钮打开的应用内菜单并返回到应用。连续按返回按钮最终必须始终返回到 Android TV 主屏幕。 例如:游戏过程 > 游戏暂停界面 > 游戏主界面 > Android TV 主界面;或电视节目播放 > 电视应用主界面 > Android TV 主界面。

有关导航设计的更多信息,请参阅 设计返回和向上导航。如需了解实现方式,请参阅提供适当的返回导航

处理游戏控制器

支持方向键控制

围绕方向键控制规划您的控制方案,因为这组控制是 Android TV 设备的默认设置。玩家必须能在游戏里使用方向键进行全方位操控 - 不仅能够控制核心游戏内容,还要能够浏览菜单和广告。为此,请确保您的 Android TV 游戏不会使用“点按此处继续”等语言来提及触摸界面。

如何设计玩家与控制器的互动对于实现卓越的用户体验至关重要。不妨参考下面的最佳实践:

  • 提前说明控制器要求:利用 Google Play 描述向玩家说明对控制器的要求。如果游戏更适合使用带有操纵杆而不是只有方向键的游戏手柄,请明确说明这一点。如果玩家使用了不适合游戏的控制器,很可能无法享受优质游戏体验,进而对游戏做出不利的评价。
  • 使用一致的按钮映射:直观的按钮映射对于提供良好的用户体验十分关键。例如,您应当遵循已被人们广泛接受的习惯,用 A 按钮表示“接受”,用 B 按钮表示“取消”。此外,您还可以通过允许重新映射来提供灵活性。如需详细了解按钮映射,请参阅处理控制器操作
  • 检测控制器功能并相应做出调整:查询控制器的功能,以优化控制器与游戏的匹配。例如,您可能想让玩家通过在空中挥动控制器来操控一个物体,但如果玩家的控制器缺少加速度计和陀螺仪硬件,挥动就不起作用。查询控制器,如果不支持移动侦测,则切换到其他可用的控制方案。如需详细了解如何查询控制器功能,请参阅跨 Android 版本支持控制器

使用适当的按钮

并非所有游戏控制器都配备开始、搜索或菜单按钮。请确保您的界面不依赖于使用这些按钮。

处理多个控制器

如果多名玩家同时玩一个游戏,且都使用自己的控制器,在这种情况下匹配每一对玩家与控制器十分重要。如需了解如何实现控制器编号标识,请参阅 getControllerNumber()

处理控制器断开连接事件

如果控制器在游戏进行过程中断开连接,游戏应暂停并显示对话框来提醒断开连接的玩家重新连接其控制器。

此外,还会在对话框中提供问题排查提示。例如,告诉玩家“检查您的蓝牙连接”。 如需详细了解如何实现输入设备支持,请参阅处理控制器操作Bluetooth 概览

显示控制器说明

如果您的游戏提供图形化游戏控制说明,请使用不含品牌信息的控制器图片,并且仅包含与 Android 兼容的按钮

如需查看与 Android 兼容的控制器的图片示例,请下载 Android TV 游戏手柄模板 (ZIP)。其中包含一个黑色背景上的白色控制器和一个白色背景上的黑色控制器(如图 1 所示),分别以 PNG 文件和 Adobe® Illustrator® 文件的形式提供。

图 1. 使用 Android TV 游戏手柄模板的控制器说明示例。