Comment simuler un événement tactile sous Android?


101

Comment simuler un événement tactile avec Android tout en donnant les coordonnées X et Y manuellement?


1
Vous obtenez des réponses réalisables ci-dessous, gardez simplement à l'esprit qu'elles ne fonctionneront que sur les applications auxquelles vous pouvez apporter de petites modifications. Pour les autres applications que vous ne pouvez pas modifier, vous auriez besoin d'une plate-forme enracinée pour injecter des événements.
— Chris Stratton

Est-il possible de faire une application pour toucher en x, y toutes les 10 secondes et le minimiser, mais en touchant en x, y continuer?
— Dr.jacky

Vérifiez ma réponse sans aucune exigence racine. :)
— Anand Varkey Philips

Réponses:


110

La méthode de Valentin Rocher fonctionne si vous avez étendu votre vue, mais si vous utilisez un écouteur d'événements, utilisez ceci:

view.setOnTouchListener(new OnTouchListener()
{
    public boolean onTouch(View v, MotionEvent event)
    {
        Toast toast = Toast.makeText(
            getApplicationContext(), 
            "View touched", 
            Toast.LENGTH_LONG
        );
        toast.show();

        return true;
    }
});


// Obtain MotionEvent object
long downTime = SystemClock.uptimeMillis();
long eventTime = SystemClock.uptimeMillis() + 100;
float x = 0.0f;
float y = 0.0f;
// List of meta states found here: developer.android.com/reference/android/view/KeyEvent.html#getMetaState()
int metaState = 0;
MotionEvent motionEvent = MotionEvent.obtain(
    downTime, 
    eventTime, 
    MotionEvent.ACTION_UP, 
    x, 
    y, 
    metaState
);

// Dispatch touch event to view
view.dispatchTouchEvent(motionEvent);

Pour en savoir plus sur l'obtention d'un objet MotionEvent, voici une excellente réponse: Android: Comment créer un MotionEvent?


1
Bonne réponse, mais en tant que débutant Android, l'OnTouchListener m'a dérouté. Je réalise maintenant que l'auditeur n'est pas nécessaire à la simulation. La seule chose nécessaire est le MotionEvent dans la seconde moitié de votre code.
— user1532390

Pourquoi ajoutez-vous 100 millis à eventTime? Cela ne fonctionne-t-il pas si le temps d'arrêt et le temps d'événement sont identiques?
— tu-Reinstate Monica-dor duh

2
@tudor - Seulement pour simuler une vraie touche. downTimeserait le moment où l'utilisateur touche l'écran vers le bas, alors que eventTimedans ce cas, ce serait le moment où l'utilisateur lève le doigt ( ACTION_UP). Je ne sais pas si cela fonctionnera toujours si les deux sont identiques. Vous pouvez le tester et publier vos résultats.
— azdev

Comment déclarer l'objet de vue?
— TheLogicGuy

ok .. qu'en est-il du geste de balayage vers la gauche, la droite, le haut et le bas… en utilisant ACTION_MOVE comment faire?
— Ramesh_D

24

Voici un script monkeyrunner qui envoie des touches et des traînées à une application. J'utilise ceci pour tester que mon application peut gérer des gestes rapides et répétitifs.

# This is a monkeyrunner jython script that opens a connection to an Android
# device and continually sends a stream of swipe and touch gestures.
#
# See http://developer.android.com/guide/developing/tools/monkeyrunner_concepts.html
#
# usage: monkeyrunner swipe_monkey.py
#

# Imports the monkeyrunner modules used by this program
from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice

# Connects to the current device
device = MonkeyRunner.waitForConnection()

# A swipe left from (x1, y) to (x2, y) in 2 steps
y = 400
x1 = 100
x2 = 300
start = (x1, y)
end = (x2, y)
duration = 0.2
steps = 2
pause = 0.2

for i in range(1, 250):
    # Every so often inject a touch to spice things up!
    if i % 9 == 0:
        device.touch(x2, y, 'DOWN_AND_UP')
        MonkeyRunner.sleep(pause)
    # Swipe right
    device.drag(start, end, duration, steps)
    MonkeyRunner.sleep(pause)
    # Swipe left
    device.drag(end, start, duration, steps)
    MonkeyRunner.sleep(pause)

1
Vous devriez utiliser à la MonkeyDevice.DOWN_AND_UPplace de 'DOWN_AND_UP'. ( DOWN_AND_UPest la valeur par défaut, donc votre code fonctionne toujours)
— ValarDohaeris

Essayé sur un autre appareil (Nexus 10), il redémarre simplement juste après l' UPaction
— Equidamoid

Puis-je l'utiliser dans une classe non testée?
— Dania

20

utiliser les commandes adb Shell pour simuler l'événement tactile

adb shell input tap x y 

and also 

adb shell sendevent /dev/input/event0 3 0 5 
adb shell sendevent /dev/input/event0 3 1 29 

1
hé que se passe-t-il si vous voulez simuler un zoom de pincement à l'aide de la commande adb et que j'ai les coordonnées du zoom de pincement
— nikhil84

1

Si je comprends bien, vous voulez le faire par programme. Ensuite, vous pouvez utiliser la méthode onTouchEvent de Viewet créer un MotionEventavec les coordonnées dont vous avez besoin.


1

Vous devriez essayer le nouveau monkeyrunner . Cela peut peut-être résoudre vos problèmes. Vous y mettez des codes clés pour les tests, peut-être que des événements tactiles sont également possibles.


1
Veuillez me faire savoir comment installer monkeyrunner. adb ne reconnaît pas monkeyrunner
— indira

Ce n'est pas lié au singe excersiseur de l'interface utilisateur d'adb. Vous trouverez monkeyrunner dans le répertoire des outils de la révision 9 de l'adt.
— keyboardsurfer

Consultez également le lien que j'ai fourni dans ma réponse. Cela conduit aux informations fournies par Google sur le monkeyrunner.
— keyboardsurfer

J'ai essayé avec "./adb shell monkey". Mais ne pouvait pas invoquer l'événement tactile
— indira

Ce n'est pas adb shell monkeyle cas monkeyrunner, qui est un outil différent.
— keyboardsurfer

0

Lors de l'utilisation de Monkey Script, j'ai remarqué que DispatchPress (KEYCODE_BACK) ne faisait rien de vraiment nul. Dans de nombreux cas, cela est dû au fait que l'activité ne consomme pas l'événement Key. La solution à ce problème consiste à utiliser un mélange de script monkey et de commande d'entrée du shell adb dans une séquence.

1 L'utilisation du script monkey a donné un excellent contrôle de la synchronisation. Attendez un certain nombre de secondes pour l'activité et c'est un appel adb bloquant.
2 Enfin, l'envoi de keyevent d'entrée du shell adb mettra fin à l'APK en cours d'exécution.

PAR EXEMPLE

adb shell monkey -p com.my.application -v -v -v -f /sdcard/monkey_script.txt 1
entrée du shell adb keyevent 4


Bienvenue dans Stack Overflow! Merci d'avoir publié votre réponse! Veuillez lire attentivement la FAQ sur l'auto-promotion . Notez également qu'il est nécessaire de publier une clause de non-responsabilité chaque fois que vous créez un lien vers votre propre site / produit. J'ai supprimé le lien. Ne le rajoutez pas sans ajouter également une divulgation.
— Andrew Barber

-6

MotionEvent est généré uniquement en touchant l'écran.


10
Vous pouvez en créer un manuellement à l'aide de l'une des méthodes d'obtention statique de MotionEvent.
— azdev
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.