Android simule un glissement rapide

Je fais un script d'automatisation générique.

J'ai besoin d'envoyer des événements de glissement complexes sur l'écran Android sans avoir spécifiquement accès à la (les) application (s) ciblée (s)

  • Transférer des données entre iOS et Android via Bluetooth?
  • La Gravité par texte ne fonctionne pas correctement dans Android
  • Comment définir différentes hauteurs pour chaque ligne dans un ListView?
  • NoClassDefFoundError: résolution échouée de: Lokhttp3 / internal / Platform
  • GreenDAO créant une propriété d'identification automatique
  • Comment modifier la couleur du diviseur par défaut pour toutes les listViews
  • La meilleure façon dont j'ai pensé jusqu'à présent est d'utiliser adb, de créer un fichier avec des commandes sendevent, de le charger sur l'appareil et de l'exécuter à partir de là. Même cela, il est douloureusement lent (beaucoup plus lent par rapport à si je l'enregistre avec getevent et le renvois).

    J'ai réussi à optimiser le fichier car j'ai compris que chaque bloc sendevent n'exige pas spécifiquement X et Y, mais il reste encore quelques ordres de grandeur plus lentement

    Exemple de partie du fichier (j'essaie 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 

    Je me concentre donc sur l'optimisation de la vitesse des swipes longues et complexes, non de multiples petites.

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


    Ainsi, l'idée de Chris Stratton a fonctionné en principe (la nouvelle connexion à la sortie cat-ed génère le même glissement avec succès), mais je ne peux pas pouvoir créer mon propre code pour le renvoyer. Je suppose que c'est quelque chose à faire Avec les séparateurs entre les commandes d'envoi de l'événement … mais je ne peux toujours pas le faire fonctionner

    J'ai utilisé une modification du fichier sendevent.c pour obtenir un fichier avec triples par ligne et sortie dans un autre fichier. Est-ce que vous savez quel pourrait être le problème? La conversion semble bonne …


    SOLLUTION: J'ai réussi à le résoudre, surtout grâce aux réponses ci-dessous. Voici un script C qui prend un fichier avec des valeurs HEX et produit le fichier binaire approprié.

    Utilisation: (pour moi, le fichier de pilote tactile est / dev / input / event5 – HTC One – pour d'autres appareils, il pourrait s'agir d'un fichier différent!)

      $> 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; } 

    2 Solutions collect form web for “Android simule un glissement rapide”

    Votre retard est probablement le résultat d'un lancement inefficace d'un nouveau processus sendevent à plusieurs reprises, analyse l'enregistrement des événements textuels et ouvre le nœud du périphérique – pour chaque événement individuel. Si vous préférez tout à partir d'une procédure unique, ouvrez le fichier de périphérique une seule fois, cela sera beaucoup plus efficace.

    Si nous regardons la source de sendevent dans la boîte à outils (par exemple, à partir du miroir non officiel mais navigable à https://github.com/android/platform_system_core/blob/master/toolbox/sendevent.c ), nous voyons que le noyau de quoi Il fait coder les événements dans des enregistrements binaires

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

    Et les écrire sur le périphérique approprié

     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)); 

    Pourvu que vous exécutez quelque chose en tant qu'utilisateur shell ou autre dans le groupe Unix d' input , vous devriez être en mesure d'accomplir la même chose que le sendevent partir de votre propre programme personnalisé ou d'utiliser d'autres outils de ligne de commande comme le cat , ce qui permet de pousser efficacement un binaire Fichier d'événements.

    Par exemple

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

    Faites quelques événements sur l'écran tactile, puis ctrl-C pour tuer le chat

    Maintenant, vous pouvez lire le fichier capturé des événements binaires:

     cat events > /dev/input/event2 

    (Remarque: sendevent réduit à zéro la partie du temps de chaque enregistrement, l'enregistrement et la lecture peuvent ne pas le faire, vous devrez voir, et s'il est égal à zéro les parties de chaque enregistrement du fichier avant de l'écrire à nouveau)

    Si vous voulez simplement produire des balayages linéaires, vous pouvez utiliser input swipe commande de transfert d' input swipe sur le shell.

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

    La commande ci-dessous donne une belle ligne pour moi dans une application de dessin

     $ adb shell input swipe 300 300 500 1000 

    Et plus rapide

     $ adb shell input touchscreen swipe 300 300 500 1000 100 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.