【问题标题】:Android /dev/uinput does not workAndroid /dev/uinput 不起作用
【发布时间】:2016-03-14 15:20:02
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    首先,您需要使用ioctl(m_fd, UI_SET_KEYBIT, 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 输出并检查设备是否创建成功。它将采用通用的 keychar 映射和键布局,因为没有定义 keymap。如果要定义它,请查看 /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)
    

    【讨论】:

    • @user1659072 这对你有用吗?如果是,请将答案标记为正确。很高兴看到一个简短的代码示例,如何实现它。
    猜你喜欢
    • 2017-12-06
    • 2015-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 2012-12-16
    • 2018-05-05
    相关资源
    最近更新 更多