我试图通过将数据写入/dev/uinput 来控制 Android。例如,如果我在桌面上输入“A”,代码会根据 key_code 向 uinput 写入一些内容,而 Android 应该表现得像我在手机上输入“A”一样。我遵循 RemoteInput 中的代码.我在 JB 4.2 系统的 Nexus 4 上进行了测试。所有 ioctl 都返回正结果,这意味着它应该可以工作。但是,当我输入“A”时,Android 似乎只刷新虚拟键盘而没有输入任何内容。
最佳答案
首先,您需要使用 ioctl(m_fd, UI_SET_KEYBIT, key)
“注册”支持的 key 。对于 A,您应该使用 KEY_A
,它在 linux/input.h
(#define KEY_A 30
) 中定义,而不是 KEYCODE_A
,这是一个不同的代码。根据我的经验,Android 上的 /dev/uinput
使用 Linux 键码。
你应该:
- 打开
/dev/uinput
ioctl(m_fd, UI_SET_EVBIT, EV_KEY)
- 支持 EV_KEY 事件ioctl(m_fd, UI_SET_EVBIT, EV_SYN)
- 支持 EV_SYN 事件ioctl(m_fd, UI_SET_KEYBIT, key)
- 支持key
- 对于你想要支持的每个键码- 创建
uinput_user_dev
结构并填充它,然后将该结构写入/dev/uinput
文件描述符(见下文) - 调用
ioctl(m_fd, UI_DEV_CREATE)
来创建这个设备; m_fd 现在将指向新创建的设备。
监视logcat
输出并检查设备是否成功创建。它将采用通用的键字符映射和键布局,因为没有定义键映射。如果您想定义它,请查看 /system/usr/keychars
和 /system/usr/keylayout
。
创建uinput设备
uinput_user_dev uidev;
memset(&uidev, 0, sizeof(uidev));
snprintf(uidev.name, UINPUT_MAX_NAME_SIZE, "uinput-test");
uidev.id.bustype = BUS_USB;
uidev.id.vendor = 0x1212;
uidev.id.product = 0xabab;
uidev.id.version = 3;
write(m_fd, &uidev, sizeof(uidev)
关于Android/dev/uinput 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17665090/