2016-03-14 3 views
0

Я пытаюсь использовать/Dev/uinput имитировать сенсорное событие в Android, некоторый код, как это:использования/DEV/uinput имитировать сенсорное событие в Android не работает

первого открытого «/ Dev/uinput» файл, и создать Udev:

static int open_uinput_device(){ 
uinp_fd = open(uinput_deivce_path, O_WRONLY | O_NDELAY); 
if (uinp_fd <= 0) { 
    debug("could not open %s, %s", uinput_deivce_path, strerror(errno)); 
    return -1; 
} 

memset(&ui_dev, 0, sizeof(ui_dev)); 
strncpy(ui_dev.name, "RemoteTV Event", UINPUT_MAX_NAME_SIZE); 
ui_dev.id.bustype = BUS_USB; 
ui_dev.id.vendor = 0x1341; 
ui_dev.id.product = 0x0001; 
ui_dev.id.version = 4; 

ui_dev.absmin[ABS_MT_SLOT] = 0; 
ui_dev.absmax[ABS_MT_SLOT] = 9; 
ui_dev.absmin[ABS_MT_TOUCH_MAJOR] = 0; 
ui_dev.absmax[ABS_MT_TOUCH_MAJOR] = 255; 
ui_dev.absmin[ABS_MT_POSITION_X] = 0; 
ui_dev.absmax[ABS_MT_POSITION_X] = screen_width - 1; 
ui_dev.absmin[ABS_MT_POSITION_Y] = 0; 
ui_dev.absmax[ABS_MT_POSITION_Y] = screen_Height - 1; 
ui_dev.absmin[ABS_MT_TRACKING_ID] = 0; 
ui_dev.absmax[ABS_MT_TRACKING_ID] = 65535; 
ui_dev.absmin[ABS_MT_PRESSURE] = 0; 
ui_dev.absmax[ABS_MT_PRESSURE] = 30; 
ui_dev.absmin[ABS_MT_TOOL_TYPE] = 0; 
ui_dev.absmax[ABS_MT_TOOL_TYPE] = 1; 

//enable direct 
ioctl(uinp_fd, UI_SET_PROPBIT, INPUT_PROP_DIRECT); 
//enable mouse event 
ioctl(uinp_fd, UI_SET_EVBIT, EV_REL); 
ioctl(uinp_fd, UI_SET_RELBIT, REL_X); 
ioctl(uinp_fd, UI_SET_RELBIT, REL_Y); 
//enable touch event 
ioctl(uinp_fd, UI_SET_EVBIT, EV_ABS); 
for (i = 0; i <= ABS_CNT; i++) { 
    ioctl(uinp_fd, UI_SET_ABSBIT, i); 
} 

ioctl(uinp_fd, UI_SET_EVBIT, EV_SYN); 
ioctl(uinp_fd, UI_SET_EVBIT, EV_KEY); 
for (i = 0; i < 256; i++) { 
    ioctl(uinp_fd, UI_SET_KEYBIT, i); 
} 
ioctl(uinp_fd, UI_SET_KEYBIT, BTN_MOUSE); 
ioctl(uinp_fd, UI_SET_KEYBIT, BTN_TOUCH); 
ioctl(uinp_fd, UI_SET_KEYBIT, BTN_MOUSE); 
ioctl(uinp_fd, UI_SET_KEYBIT, BTN_LEFT); 
ioctl(uinp_fd, UI_SET_KEYBIT, BTN_MIDDLE); 
ioctl(uinp_fd, UI_SET_KEYBIT, BTN_RIGHT); 
ioctl(uinp_fd, UI_SET_KEYBIT, BTN_FORWARD); 
ioctl(uinp_fd, UI_SET_KEYBIT, BTN_BACK); 

write(uinp_fd, &ui_dev, sizeof(ui_dev)); 
if (ioctl(uinp_fd, UI_DEV_CREATE)) { 
    debug("Unable to create UINPUT device."); 
    return -1; 
} 
return 0; 

}

, а затем написать некоторые события в uinput_fd, сегмент кода, как это:

int len; 
// Move pointer to (100,100) location 
memset(&event, 0, sizeof(event)); 
gettimeofday(&event.time, NULL); 
event.type = type; 
event.code = code; 
event.value = value; 
len = write(uinp_fd, &event, sizeof(event)); 
debug("SendEventToUinput done:%d %d %d",type, code, value); 

я могу видеть события на/прописаны/разработчике ввода/event7 в терминале с помощью ввода команды «GetEvent -l», как это:

/dev/input/event7: EV_KEY  BTN_TOUCH   DOWN     
/dev/input/event7: EV_ABS  ABS_MT_TRACKING_ID 00000027    
/dev/input/event7: EV_ABS  ABS_MT_TOUCH_MAJOR 0000005d    
/dev/input/event7: EV_ABS  ABS_MT_POSITION_X 00000251    
/dev/input/event7: EV_ABS  ABS_MT_POSITION_Y 0000048f    
/dev/input/event7: EV_SYN  SYN_REPORT   00000000    
/dev/input/event7: EV_ABS  ABS_MT_TOUCH_MAJOR 00000045    
/dev/input/event7: EV_SYN  SYN_REPORT   00000000    
/dev/input/event7: EV_ABS  ABS_MT_TRACKING_ID ffffffff    
/dev/input/event7: EV_SYN  SYN_REPORT   00000000    
/dev/input/event7: EV_KEY  BTN_TOUCH   UP     
/dev/input/event7: EV_SYN  SYN_REPORT   00000000 

но ничего показать на экране, если я посылаю то же событие на «dev/input/event4» он может работать? почему «dev/uinput» является недействительным?

Кто-то мне помогает.

ответ

0

в моей pionion, вы должны использовать ADB командной строки:

adb shell sendevent /dev/input/event[event_number_here] input_value_here 

например:

adb shell sendevent /dev/input/event2 1 315 1 
adb shell sendevent /dev/input/event2 0 0 0 

или вы можете попробовать эту команду:

adb shell input tap x y 

экс: ADB входной кран для раковины 150 150

+0

ADB SendEvent оболочки для "/ DEV/вход/eventX" может работать, но когда я пишу события " dev/uinput "он не может имитировать событие касания. Что-то не так в моем сегменте кода? – caihanyuan

0

Ваш ui_dev.name уже существует, используйте другой, и он будет работать нормально.

1

При выполнении этой части:

ioctl(uinp_fd, UI_SET_EVBIT, EV_ABS); 
for (i = 0; i <= ABS_CNT; i++) { 
    ioctl(uinp_fd, UI_SET_ABSBIT, i); 
} 

Вы также установить ABS_X и ABS_Y биты. Биты ABS_X и ABS_Y не должны устанавливаться вместе с битами ABS_MT_POSITION_X и ABS_MT_POSITION_Y.

Предлагаю установить только биты АБС, которые вы будете использовать.

-1

Попробуйте изменить последовательность присваивающих аргументов в:

strncpy(ui_dev.name, "RemoteTV Event", UINPUT_MAX_NAME_SIZE); 

сделать:

strncpy(ui_dev.name, UINPUT_MAX_NAME_SIZE, "RemoteTV Event"); 
+0

Вышеуказанное предложение может быть непригодно. –

+0

Я запустил код, он отлично работает ... Но не знаю, почему указатель не указывает на точные абсолютные координаты. У меня есть внешняя мышь, подключенная к ящику Android. Когда мышь перемещается, кажется, что происходит некоторое изменение опорных осей, и EV_ABS координирует расположение на дисплее. Меня там что-то вроде калибровки или назначения контрольной точки, необходимой для каждого Нажмите Событие. Или REL_X, REL_Y мыши вмешиваются в ABS_MT_POSITION_X, ABS_MT_POSITION_Y виртуального события uinput? Большое спасибо. –

 Смежные вопросы

  • Нет связанных вопросов^_^