开发人员控制台

识别控制器


识别控制器

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_GAMEPADInputDevice.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_MOUSEInputDevice.SOURCE_TOUCHPAD常量,识别亚马逊第二屏幕应用。

int hasFlags =  InputDevice.SOURCE_MOUSE | InputDevice.SOURCE_TOUCHPAD;
bool isRemote = inputDevice.getSources() & hasFlags == hasFlags;