识别控制器
Amazon Fire TV平台允许用户同时连接多达七个蓝牙控制器。若应用或游戏支持来自多个用户或玩家的输入,则需确定所连接的控制器,识别控制器的功能,并区分来自不同控制器的用户输入。
Fire TV平台使用InputDevice
类的标准Android功能。通过InputDevice
类,可获取所有所连输入设备(包括控制器)的列表,并查询输入设备的功能。
还可从键事件或动作事件获取输入设备对象,对于不同控制器或不同用户的输入,可在输入发生时进行处理。
获取输入设备和设备ID
连接到Amazon Fire TV的输入设备由Android InputDevice
类表示。在系统启动和添加新设备时,所连接的输入设备将获得设备ID。ID列表中的输入设备可以是实际控制器(如游戏控制器),也可以表示其他形式的输入,如屏幕键盘。设备ID是任意值,不能唯一标识具体控制器或控制器类型。
可获取所有可用设备ID的列表,确定应用或游戏可用的控制器数量和类型。还可从特定键事件或动作事件获取设备ID或输入设备对象,确定该事件所使用的控制器。
获取所有输入设备ID
可使用InputDevice.getDeviceIds()
方法获取所有可用输入设备ID的数组,然后使用InputDevice.getDevice()
将ID与实际输入设备对象关联:
int[] ids = InputDevice.getDeviceIds();
for (int i=0;i < ids.length; i++) {
// 根据设备ID获取InputDevice对象
InputDevice device = InputDevice.getDevice(ids[i]);
// ...
}
请注意,利用getDeviceIds()
方法获取的设备ID列表仅包含实际连接到系统的输入设备。若在一段时间内未使用某些蓝牙控制器,则可能会断开连接(休眠)以节省电力,也可能在控制器超出范围时断开连接。
休眠或由于其他原因不可用的控制器不会被视为已连接,且不会在设备ID列表中列出。可通过InputDeviceListener
接口,侦听控制器连接和断开事件。
从键事件或动作事件获取输入设备ID
可使用InputEvent.getDeviceId()
方法,获取在事件处理程序内触发键事件或动作事件的设备ID:
public boolean onKeyDown(int keyCode, KeyEvent event) {
int id = event.getDeviceId();
InputDevice device = InputDevice.getDevice(id);
}
或者,只获取输入设备对象本身:
public boolean onKeyDown(int keyCode, KeyEvent event) {
InputDevice device = event.getDevice();
}
识别控制器功能
Android输入设备ID是任意值,不能唯一标识具体控制器或控制器类型。如需确定输入设备的类型,请查询该设备的功能,确定输入来自控制器(遥控器、游戏控制器或第二屏幕应用)还是来自其他设备。
使用InputDevice.getSources()
方法获取输入设备的功能。该方法返回一个整型位图,显示设备功能和特性。使用定义InputDevice
类的常数,将该位图与感兴趣的应用特定功能进行比较。
// 根据设备ID获取InputDevice对象
InputDevice device = InputDevice.getDevice(id);
// getSources()提供整型位图,通过该位图可确定设备的功能;
// 与InputDevice的常数进行比较,查找控制器功能
if ((device.getSources() & InputDevice.SOURCE_CLASS_JOYSTICK != 0 {
// 这个控制器有一个操纵杆
}
还可使用InputEvent.getSource()
方法,直接从键事件和动作事件获取输入设备功能位图:
public boolean onGenericMotionEvent(MotionEvent event) {
// 该事件是否来自操纵杆?
if ((event.getSource() & InputDevice.SOURCE_CLASS_JOYSTICK) != 0) {
//...使用操纵杆处理来自控制器的输入事件
// ...
}
该设备是游戏控制器吗?
可通过测试InputDevice.SOURCE_GAMEPAD
和InputDevice.SOURCE_JOYSTICK
常数,识别游戏控制器(包括亚马逊游戏控制器和其他游戏控制器)。请注意,该代码不区分亚马逊游戏控制器和其他制造商的蓝牙控制器。
int hasFlags = InputDevice.SOURCE_GAMEPAD | InputDevice.SOURCE_JOYSTICK;
boolean isGamepad = inputDevice.getSources() & hasFlags == hasFlags;
该设备是遥控器吗?
可使用InputDevice.SOURCE_DPAD
常数识别Amazon Fire TV遥控器或语音遥控器。但由于某些键盘也可能表明自己具有方向键,因此您应测试键盘类型(InputDevice.KEYBOARD_TYPE_NON_ALPHABETIC
):
int hasFlags = InputDevice.SOURCE_DPAD;
bool isRemote = (inputDevice.getSources() & hasFlags == hasFlags)
&& inputDevice.getKeyboardType() == InputDevice.KEYBOARD_TYPE_NON_ALPHABETIC;
该设备是否为第二屏幕应用?
可使用InputDevice.SOURCE_MOUSE
和InputDevice.SOURCE_TOUCHPAD
常数识别亚马逊第二屏幕应用。
int hasFlags = InputDevice.SOURCE_MOUSE | InputDevice.SOURCE_TOUCHPAD;
bool isRemote = inputDevice.getSources() & hasFlags == hasFlags;