java - 使用 uinput 驱动程序创建虚拟多点触控设备

标签 java android java-native-interface linux-device-driver

我尝试在没有触摸屏的 Android 设备上注入(inject)事件。我正在使用用户空间输入设备(uinput)来执行此操作,但它不起作用。

我正在使用此代码:

fd_virtual_dev = open("/dev/uinput", O_WRONLY | O_NONBLOCK);
if (fd_virtual_dev < 0)
    return die("error: open");

if (ioctl(fd_virtual_dev, UI_SET_EVBIT, EV_ABS) < 0)
    return die("error: ioctl ev_abs");
if (ioctl(fd_virtual_dev, UI_SET_EVBIT, EV_SYN) < 0)
    return die("error: ioctl ev_syn");
if (ioctl(fd_virtual_dev,UI_SET_ABSBIT,ABS_MT_TOUCH_M AJOR) < 0)
    return die("error: ioctl ABS_MT_TOUCH_MAJOR");
if (ioctl(fd_virtual_dev,UI_SET_ABSBIT,ABS_MT_WIDTH_M AJOR) < 0)
    return die("error: ioctl ABS_MT_TOUCH_MAJOR");
if (ioctl(fd_virtual_dev,UI_SET_ABSBIT,ABS_MT_POSITIO N_X) < 0)
    return die("error: ioctl ABS_MT_POSITION_X");
if (ioctl(fd_virtual_dev,UI_SET_ABSBIT,ABS_MT_POSITIO N_Y) < 0)
    return die("error: ioctl ABS_MT_POSITION_Y");
if (ioctl(fd_virtual_dev,UI_SET_ABSBIT,ABS_MT_TRACKIN G_ID) < 0)
    return die("error: ioctl ABS_MT_TRACKING_ID");
if (ioctl(fd_virtual_dev,UI_SET_ABSBIT,ABS_MT_SLOT) < 0)
    return die("error: ioctl");
if (ioctl(fd_virtual_dev,UI_SET_ABSBIT,ABS_MT_PRESSUR E) < 0)
    return die("error: ioctl ABS_MT_PRESSURE");

memset(&uidev, 0, sizeof(uidev));
snprintf(uidev.name, UINPUT_MAX_NAME_SIZE, "uinput-device");
uidev.id.bustype = BUS_VIRTUAL;
uidev.id.vendor = 0x0;
uidev.id.product = 0x0;
uidev.id.version = 0;    
uidev.absmax[ABS_MT_TOUCH_MAJOR] = 64;
uidev.absmax[ABS_MT_WIDTH_MAJOR] = 64;
uidev.absmax[ABS_MT_POSITION_X] = 1024;
uidev.absmax[ABS_MT_POSITION_Y] = 800;
uidev.absmax[ABS_MT_TRACKING_ID] = 65535;
uidev.absmax[ABS_MT_SLOT] = 9;
uidev.absmax[ABS_MT_PRESSURE] = 64;

现在,如果我尝试发送多点触控协议(protocol) B 事件,我只能在屏幕上看到一个伪随机点中的小圆圈

我也尝试过使用协议(protocol) A 并在触摸屏手机上获得相同的结果 阿方索

最佳答案

如果 UI_SET_PROPBIT 未在您包含的头文件“uinput.h”中定义,请添加以下行:

#define UI_SET_PROPBIT    _IOW(UINPUT_IOCTL_BASE, 110, int)

行前:

ioctl(uinput_fd, UI_SET_PROPBIT, INPUT_PROP_DIRECT)

我在 Nexus7 上测试过。触摸事件工作得很好,但它不能应用于 Android 系统虚拟按钮(BACK、HOME 和 RECENT),这是一个不同的问题。

关于java - 使用 uinput 驱动程序创建虚拟多点触控设备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18544734/

相关文章:

java - 应用比例时不支持路径转换

java - 使用 Java 的 ChickenCounter 程序和 ChickenCounter 测试器

java - 日志数据多次打印

android - Galaxy SIII 上的 CsipSimple

java - 通过 JNI 从 Java 使用 CoreBluetooth 时未调用 didDiscoverCharacteristics

java - 在java SWT Composite中不按照设置的布局进行布局

java - 如果 getLine1Number() 返回 null,则获取 Sim 号码的替代方法

java - 如果我这样做的话,android 中创建的文件会在哪里

java - 在一个线程上初始化的jmethodID可以在另一个线程中使用吗?

java - ubuntu 上的 JNI 不满意链接错误