过滤实际输入设备

时间:2018-01-20 06:48:43

标签: android input gamepad input-devices

我正在尝试按照以下方式获取已连接的游戏手柄列表:

InputDevice.getDeviceIds()
        .map { InputDevice.getDevice(it) }
        .filter { it.sources and InputDeviceCompat.SOURCE_GAMEPAD == InputDeviceCompat.SOURCE_GAMEPAD }
        .forEach {
            Log.i("gamepads", "$it")
        }

一般来说,它应该只返回游戏手柄,但是对于我的Nexus TV,这个区块还会找到另外两个相同类型的设备:

Input Device 4: virtual-search
Descriptor: 38c59f5a8771de8bd485da05030eb001094d7936
Generation: 10
Location: built-in
Keyboard Type: non-alphabetic
Has Vibrator: false
Has mic: false
Sources: 0x701 ( keyboard dpad gamepad )

有趣的事实:虽然这些设备显然是虚拟的,但是呼叫InputDevice.isVirtual()都会返回false。

因此,最简单的解决方案是根据mLocation的{​​{1}}字段过滤设备。幸运的是,InputDevice有公共方法来检查它。不幸的是,此方法InputDevice被标记为隐藏,因此无法使用。

有没有其他方法可以过滤掉这些虚拟设备而无需通过反射访问隐藏的方法/字段?

1 个答案:

答案 0 :(得分:1)

看起来可能的解决方案是根据vendorId过滤设备。对于这些virtual-searchInputDevice.getVendorId()0返回#include <algorithm> int find_max(int x, int y, int z) { return std::max(z, std::max(x,y)); } ,而实际外部设备则为非零。

当然,我禁止使用一些具有空供应商ID的noname设备,但它仍然比访问有效无法保证工作的隐藏方法更好。