我试图通过将数据写入/ dev / uinput来控制Android。例如,如果我在桌面上输入“A”,则代码会根据key_code将某些内容写入uinput,而Android应该像我在手机上输入“A”一样。我正在关注RemoteInput中的代码。我在使用JB 4.2系统的Nexus 4上进行了测试。所有的ioctls都会返回正面结果,这意味着它应该有效。但是,当我输入'A'时,Android似乎只刷新虚拟键盘并且不输入任何内容。
答案 0 :(得分:1)
首先,您需要使用ioctl(m_fd, UI_SET_KEYBIT, key)
“注册”支持的密钥。对于A,您应该使用KEY_A
,linux/input.h
(#define KEY_A 30
)而不是KEYCODE_A
定义,/dev/uinput
是不同的代码。根据我的经验,Android上的/dev/uinput
可以使用Linux密钥代码。
你应该:
ioctl(m_fd, UI_SET_EVBIT, EV_KEY)
ioctl(m_fd, UI_SET_EVBIT, EV_SYN)
- 支持EV_KEY事件ioctl(m_fd, UI_SET_KEYBIT, key)
- 支持EV_SYN事件key
- 支持uinput_user_dev
- 针对您要支持的每个键码/dev/uinput
结构并填充它,然后将该结构写入ioctl(m_fd, UI_DEV_CREATE)
文件描述符(见下文)logcat
以创建此设备; m_fd现在将指向新创建的设备。监视/system/usr/keychars
输出并检查设备是否将成功创建。它将采用通用的keychar映射和键布局,因为没有定义键映射。如果您想定义它,请查看/system/usr/keylayout
和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)
。
{{1}}