1

我试图通过将数据写入 /dev/uinput 来控制 Android。例如,如果我在桌面上输入“A”,代码将根据 key_code 将一些内容写入 uinput,Android 的行为应该就像我在手机上输入“A”一样。我正在关注RemoteInput中的代码。我在带有 JB 4.2 系统的 Nexus 4 上进行了测试。所有 ioctl 都返回积极的结果,这意味着它应该可以工作。但是,当我输入“A”时,Android 似乎只刷新虚拟键盘并且不输入任何内容。

4

1 回答 1

1

首先,您需要使用ioctl(m_fd, UI_SET_KEYBIT, key). 对于 A,您应该使用在( )KEY_A中定义的 ,而不是,这是不同的代码。根据我的经验,在 Android 上可以使用 Linux 密钥代码。linux/input.h#define KEY_A 30KEYCODE_A/dev/uinput

你应该:

  1. 打开/dev/uinput
  2. ioctl(m_fd, UI_SET_EVBIT, EV_KEY)- 支持EV_KEY事件
  3. ioctl(m_fd, UI_SET_EVBIT, EV_SYN)- 支持 EV_SYN 事件
  4. ioctl(m_fd, UI_SET_KEYBIT, key)- 支持key- 对于您想要支持的每个键码
  5. 创建uinput_user_dev结构并填充它,然后将该结构写入/dev/uinput文件描述符(见下文)
  6. 调用ioctl(m_fd, UI_DEV_CREATE)创建此设备;m_fd 现在将指向新创建的设备。

监视logcat输出并检查设备是否创建成功。它将采用通用的 keychar 映射和键布局,因为没有定义 keymap。如果要定义它,请查看/system/usr/keycharsand /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 回答