Android simuler rapide de balayage

Je suis en train de faire un générique de script d'automatisation.

J'ai besoin d'envoyer complexe de balayage des événements à l'écran android sans avoir spécifiquement l'accès à la demande(s)

Meilleure façon que j'ai compris jusqu'à présent est d'utiliser de la bad, de créer un fichier avec sendevent commandes, appuyez sur l'appareil et exécuter à partir de là. Encore que, il est très lent (beaucoup plus lent par rapport à si j'enregistre avec getevent et le tuyau de retour dans).

J'ai réussi à optimiser le fichier depuis j'ai compris que chaque sendevent bloc n'exige pas expressément à la fois X et Y, mais il est encore quelques ordres de grandeur inférieure à

Exemple de la partie du fichier (je vais essayer sur un 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

Donc, mon objectif est d'optimiser la vitesse de simples de longue complexe glisse, pas de multiples petits.

Quelqu'un sait d'une meilleure façon de le faire?


Donc, Chris Stratton idée travaillé en principe (remplacement de la tuyauterie, le chat-ed génère le même balayage avec succès), mais je ne peux pas être en mesure de créer mon propre code pour la pipe. Je suppose que c'est quelque chose à voir avec les séparateurs entre les envoyer événement commandes... mais je ne peux toujours pas le faire fonctionner

J'ai utilisé une modification de la sendevent.c fichier pour obtenir un fichier avec des triples par ligne et sortie vers un autre fichier. Savez-vous ce que pourrait être le problème? La Conversion semble bon ...


SOLUTION: j'ai réussi à le résoudre, surtout grâce aux réponses ci-dessous. Voici un C un script qui prend un fichier avec les valeurs hexadécimales et les sorties de l'appropriées fichier binaire.

Utilisation: (pour moi, le toucher fichier de pilote est /dev/input/event5 - HTC One - pour les autres appareils, il peut être un autre fichier !!!)

 $> 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"

et la source:

#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;
}
Je sais que c'est une vieille question, mais seriez-vous en mesure d'expliquer comment profiter de cette nouvelle sendevents.c fichier sur l'appareil android, je suppose que vous utiliser adb push mais ne sais pas dans quel répertoire je peux placer le fichier sur de sorte qu'il est un exécutable.
J'ai maintenant créé une question qui est plus approprié. votre aide serait appréciée. stackoverflow.com/questions/23131081/...
J'ai posté une réponse à votre question. Espérons que cela aide: stackoverflow.com/questions/23131081/...

OriginalL'auteur Stefan | 2013-09-28