2

タッチスクリーンのない Android デバイスにイベントを挿入しようとしています。そのためにユーザー空間入力デバイス (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;

ここで、マルチタッチ プロトコル B イベントを送信しようとすると、画面上の疑似ランダム ポイントに小さな円しか表示されません。

プロトコルAとタッチスクリーン電話でも試してみましたが、同じ結果でした Alfonso

4

2 に答える 2

2

インクルードするヘッダファイル 'uinput.h' で UI_SET_PROPBIT が定義されていない場合は、以下の行を追加します。

#define UI_SET_PROPBIT    _IOW(UINPUT_IOCTL_BASE, 110, int)

行の前に:

ioctl(uinput_fd, UI_SET_PROPBIT, INPUT_PROP_DIRECT)

Nexus7でテストしました。タッチ イベントは、別の問題である Android システムの仮想ボタン (BACK、HOME、RECENT) に適用できないことを除けば、うまく機能します。

于 2014-10-15T11:44:22.513 に答える
1

次の ioctl 呼び出しを追加してみてください。

ioctl(dev_file, UI_SET_PROPBIT, INPUT_PROP_DIRECT)

それでもうまくいかない場合は、指定した製品 ID とベンダー IDの IDC ファイルを (ここで/system/usr/idc説明されているように) に追加する必要があります。あなたの場合は になりますが/system/usr/idc/Vendor_0000_Product_0000.idc、一意の製品/ベンダーの値を使用することを検討してください。

IDC ファイルは、デバイスがタッチ スクリーンであることを指定する必要があります。 touch.deviceType = touchScreen

IDC ファイルがない場合、デバイスはマウスとして識別される可能性が高く、小さな円が表示されます。カスタム Android イメージを作成している場合は、IDC ファイルを の下の Android ソース ツリーにドロップできます/out/target/product/<product>/system/usr/idc。それ以外の場合は、「adb shell」経由で IDC をアップロードしてみてください。

于 2014-01-17T22:48:45.583 に答える