我试图通过将数据写入 /dev/uinput 来控制 Android。例如,如果我在桌面上输入“A”,代码将根据 key_code 将一些内容写入 uinput,Android 的行为应该就像我在手机上输入“A”一样。我正在关注RemoteInput中的代码。我在带有 JB 4.2 系统的 Nexus 4 上进行了测试。所有 ioctl 都返回积极的结果,这意味着它应该可以工作。但是,当我输入“A”时,Android 似乎只刷新虚拟键盘并且不输入任何内容。
问问题
2777 次
1 回答
1
首先,您需要使用ioctl(m_fd, UI_SET_KEYBIT, key)
. 对于 A,您应该使用在( )KEY_A
中定义的 ,而不是,这是不同的代码。根据我的经验,在 Android 上可以使用 Linux 密钥代码。linux/input.h
#define KEY_A 30
KEYCODE_A
/dev/uinput
你应该:
- 打开
/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
输出并检查设备是否创建成功。它将采用通用的 keychar 映射和键布局,因为没有定义 keymap。如果要定义它,请查看/system/usr/keychars
and /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)
于 2014-06-11T21:23:14.807 回答