Intereting Posts
Android RelativeLayout height не соответствует высоте GridView Есть ли способ получить имя текущего процесса в Android Как вы проверяете, играет ли музыка с помощью широковещательного приемника? Как создать экземпляр слушателя путем отражения в Android Не удалось разрешить: скомпилировать 'com.google.firebase: firebase-config: 9.2.1' Эксперименты с Android Content с менеджером тегов не показывают сеансов через несколько дней Admob с Android: невозможно разобрать андроид: configChanges в манифесте АБР отключился через несколько минут Предупреждение в Google Play: обработчик WebViewClient.onReceivedSslError Копирование нескольких файлов txt в / с помощью Android.mk Удаление нежелательного белого пространства в WebView Android Ошибка Android Studio: невозможно загрузить проект Разбиение большого текста на страницы в текстовом переключателе android Как лучше всего преобразовать StringBuilder в String ? Видео не приостанавливается в фрагменте ViewPager

Android имитирует быстрый салфетки

Я выполняю общий сценарий автоматизации.

Мне нужно отправить сложные события салфетки на экран андроида, не имея при этом специального доступа к целевым приложениям,

Лучший способ, который я догадался до сих пор, – использовать adb, создать файл с командами sendevent, нажать его на устройство и запустить его оттуда. Даже это, это больно медленно (намного медленнее по сравнению с тем, если я записываю его с помощью getevent и перекачиваю его обратно).

Мне удалось оптимизировать файл, так как я понял, что каждый блок отправления специально не требует как X, так и Y, но он все же на несколько порядков медленнее

Пример части файла (я пытаюсь использовать HTC One):

sendevent /dev/input/event5 3 57 49 sendevent /dev/input/event5 3 53 942 sendevent /dev/input/event5 3 54 2747 sendevent /dev/input/event5 0 0 0 sendevent /dev/input/event5 3 53 1207 sendevent /dev/input/event5 3 54 2483 sendevent /dev/input/event5 0 0 0 sendevent /dev/input/event5 3 53 1472 sendevent /dev/input/event5 0 0 0 sendevent /dev/input/event5 3 54 2218 sendevent /dev/input/event5 0 0 0 sendevent /dev/input/event5 3 53 1207 sendevent /dev/input/event5 3 54 2483 sendevent /dev/input/event5 0 0 0 sendevent /dev/input/event5 3 53 1472 

Поэтому я сосредоточен на оптимизации скорости одиночных длинномерных сложностей, а не нескольких небольших.

Кто-нибудь знает лучший способ сделать это?


Таким образом, идея Криса Стрэттона работала в принципе (повторное подключение кошачьего выходного файла приводит к тому же удачному удару), но я не могу создать свой собственный код, чтобы передать его обратно. Я предполагаю, что это что-то делать С разделителями между командами событий отправки … но я до сих пор не могу заставить его работать

Я использовал модификацию файла sendevent.c для получения файла с тройками в строке и вывода в другой файл. Вы случайно не знаете, в чем проблема? Конверсия выглядит хорошо …


РЕШЕНИЕ: Мне удалось это решить, в основном благодаря ответам ниже. Вот сценарий C, который принимает файл с значениями HEX и выводит соответствующий двоичный файл.

Использование: (для меня файл с сенсорным драйвером – / dev / input / event5 – HTC One – для других устройств это может быть другой файл !!!)

  $> adb shell getevent > tmp.in $> ./sendevent tmp.in tmp.out $> adb shell push tmp.out /mnt/sdcard/ $> adb shell "cd /mnt/sdcard/ && cat tmp.out > /dev/input/event5" 

И источник:

 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdint.h> #include <fcntl.h> #include <sys/ioctl.h> #include <unistd.h> #include <errno.h> typedef uint32_t __u32; typedef uint16_t __u16; typedef __signed__ int __s32; __attribute__((aligned(1),packed)) struct input_event { __u32 time_dummy_1; __u32 time_dummy_2; __u16 type; __u16 code; __s32 value; }; int convert (char * str) { return (int) strtol(str, NULL, 16); } #define S_ALL (S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IWGRP | S_IXGRP | S_IROTH | S_IWOTH | S_IXOTH) int main (int argc, char *argv[]) { int i; int fd; int ret; if(argc < 3) { fprintf(stderr, "use: %s in-file out-file\n", argv[0]); return 1; } fd = open(argv[2], O_CREAT | O_WRONLY, S_ALL); if(fd < 0) { fprintf(stderr, "could not open %s, %s\n", argv[2], strerror(errno)); return 1; } FILE * fd_in = fopen(argv[1], "r"); if (fd_in == NULL) { fprintf(stderr, "Can't open input file: %s\n", argv[1]); return 1; } struct input_event event; char type[32]; char code[32]; char value[32]; int count = 0; while (fscanf(fd_in, "%s %s %s", type, code, value) != EOF) { memset(&event, 0, sizeof(event)); // printf("%d) %s %s %s\n", ++count, type, code, value); event.type = convert(type); event.code = convert(code); event.value = convert(value); memset(type, 0, sizeof(type)); memset(code, 0, sizeof(code)); memset(value, 0, sizeof(value)); ret = write(fd, &event, sizeof(event)); if(ret < sizeof(event)) { fprintf(stderr, "write event failed, %s\n", strerror(errno)); return -1; } } return 0; } 

Solutions Collecting From Web of "Android имитирует быстрый салфетки"

Задержка, скорее всего, является результатом неэффективного многократного запуска нового процесса sendevent , разбора текстовой записи события и открытия узла устройства – для каждого отдельного события. Если вы делаете все из одного процесса, открывая файл устройства только один раз, он будет намного более эффективным.

Если мы посмотрим на источник для sendevent в панели инструментов (например, из неофициального, но просматриваемого зеркала на https://github.com/android/platform_system_core/blob/master/toolbox/sendevent.c ), мы видим, что ядро ​​того, что Он выполняет кодирование событий в двоичные записи

 struct input_event { struct timeval time; __u16 type; __u16 code; __s32 value; }; 

И записывая их на соответствующее устройство

 memset(&event, 0, sizeof(event)); event.type = atoi(argv[2]); event.code = atoi(argv[3]); event.value = atoi(argv[4]); ret = write(fd, &event, sizeof(event)); 

Если вы выполняете что-то в качестве идентификатора shell или другого во input группе unix, вы должны иметь возможность выполнить то же самое, что sendevent делает из вашей собственной программы, или использовать другие инструменты командной строки, такие как cat , тем самым эффективно нажав двоичный файл Файл записей событий.

Например

 adb shell cd /mnt/sdcard cat /dev/input/event2 > events 

Сделайте несколько событий с сенсорным экраном, затем ctrl-C, чтобы убить кошку

Теперь вы можете воспроизвести захваченный файл двоичных событий:

 cat events > /dev/input/event2 

(Примечание: sendevent обнуляет timeval часть каждой записи, запись и воспроизведение могут не делать этого, вам нужно будет увидеть, и если это имеет значение нуль для каждой части каждой записи из файла, прежде чем вы ее запишите)

Если вы просто хотите производить линейные прокрутки, вы можете использовать команду input swipe для оболочки.

 $ adb shell input usage: input ... input text <string> input keyevent <key code number or name> input [touchscreen|touchpad|touchnavigation] tap <x> <y> input [touchscreen|touchpad|touchnavigation] swipe <x1> <y1> <x2> <y2> [duration(ms)] input trackball press input trackball roll <dx> <dy> 

Команда ниже рисует красивую строку для меня в приложении рисования

 $ adb shell input swipe 300 300 500 1000 

И более быстрый

 $ adb shell input touchscreen swipe 300 300 500 1000 100