Android/dev/uinput 不工作

标签 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 上进行了测试。所有 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 键码。

你应该:

  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 输出并检查设备是否成功创建。它将采用通用的键字符映射和键布局,因为没有定义键映射。如果您想定义它,请查看 /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/

相关文章:

android - 无法在 Android Studio 中安装 LLDB 和 Cmake

android - 以编程方式 native 崩溃

java - Android ksoap2 将对象添加到对象中

多种语言的Android应用程序

java - 如何将鼠标移动和点击从 Android 发送到桌面

java - 位图/ Canvas 的使用和 NDK

c - 在Linux内核模块中使用线程的问题

linux -/dev/tty* 的设备节点未为 uart 串行驱动程序创建

linux-device-driver - 如何在 linux 内核 3.17 上为 BeagleBone Black 编辑 pinmux?

android - AChartEngine : how recognise touch in line chart?