Android / dev / uinput不起作用

时间:2013-07-15 22:36:40

标签: android android-ndk linux-device-driver user-input vnc-server

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

1 个答案:

答案 0 :(得分:1)

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

你应该:

  1. 打开ioctl(m_fd, UI_SET_EVBIT, EV_KEY)
  2. ioctl(m_fd, UI_SET_EVBIT, EV_SYN) - 支持EV_KEY事件
  3. ioctl(m_fd, UI_SET_KEYBIT, key) - 支持EV_SYN事件
  4. key - 支持uinput_user_dev - 针对您要支持的每个键码
  5. 创建/dev/uinput结构并填充它,然后将该结构写入ioctl(m_fd, UI_DEV_CREATE)文件描述符(见下文)
  6. 致电logcat以创建此设备; m_fd现在将指向新创建的设备。
  7. 监视/system/usr/keychars输出并检查设备是否将成功创建。它将采用通用的keychar映射和键布局,因为没有定义键映射。如果您想定义它,请查看/system/usr/keylayoutuinput_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)


    创建输入设备

    {{1}}