【问题标题】:Android virtual touchscreen device multi touch protocolAndroid虚拟触摸屏设备多点触控协议
【发布时间】:2015-01-13 22:48:11
【问题描述】:

早上好,

我可以在有根的 Android 手机中使用 uinput 创建虚拟触摸屏。使用以下 jni 代码:

static int startDevice(const char *touchdevice) {

 struct uinput_user_dev uidev;
 int fd;

 fd = open("/dev/uinput", O_WRONLY | O_NONBLOCK);
 if (fd < 0) {
    die("error: open");
 }
 memset(&uidev, 0, sizeof(uidev));

 snprintf(uidev.name, UINPUT_MAX_NAME_SIZE, "%s",touchdevice);


 uidev.id.bustype = 0;
 uidev.id.vendor = 0x0;
 uidev.id.product = 0x0;
 uidev.id.version = 0;
 uidev.absmax[ABS_MT_POSITION_X] = 1280;
 uidev.absmax[ABS_MT_POSITION_Y] = 800;

 if (write(fd, &uidev, sizeof(uidev)) < 0) {
    die("error: write");
 }
 ioctl(fd, UI_SET_EVBIT, EV_ABS);


 ioctl(fd, UI_SET_ABSBIT, ABS_MT_POSITION_X);
 ioctl(fd, UI_SET_ABSBIT, ABS_MT_POSITION_Y);
 ioctl(fd, UI_SET_ABSBIT, ABS_MT_PRESSURE);
 ioctl(fd, UI_SET_ABSBIT, ABS_MT_TOUCH_MAJOR);
 ioctl(fd, UI_SET_ABSBIT, ABS_MT_SLOT);
 ioctl(fd, UI_SET_ABSBIT, ABS_MT_TRACKING_ID);

 ioctl(fd, UI_SET_KEYBIT, BTN_TOUCH);


 if (ioctl(fd, UI_DEV_CREATE, 0) < 0) {
    die("error: ioctl");
 }

 idVirtualTouch = fd;

 return 55;
}

当调用方法时,我给 touchdevice 赋予相同的名称具有默认的 android 触摸屏。因此,当它创建触摸设备时,它会加载默认触摸屏的配置文件(.idc)。

问题在于它创建了一个响应多点触控协议 A 而不是 B (https://www.kernel.org/doc/Documentation/input/multi-touch-protocol.txt) 的虚拟设备。

我目前正在使用带有 android 4.1.2 的 Galaxy tab2,如果我将默认设备(协议 b)事件转发到虚拟驱动器,它需要协议 A 事件,因此无法正常工作。

默认触摸屏没有 .idc,所以我只创建了一个:

touch.deviceType = touchScreen
touch.internal = 1

所以我的问题是我必须做什么才能让我的触控驱动程序使用协议 B?问题是我的 .idc 还是设备的初始化?

感谢您的宝贵时间

【问题讨论】:

    标签: android multi-touch


    【解决方案1】:

    发现问题,忘记定义slot和tracking id

    uidev.absmax[ABS_MT_TRACKING_ID] = 65535;
    uidev.absmax[ABS_MT_SLOT] = 9;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-10
      • 1970-01-01
      • 2014-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-06
      相关资源
      最近更新 更多