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?

indira
la source
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?

azdev
la source
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)
Warwick
la source
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 
Arjun Prakash
la source
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.

Valentin Rocher
la source
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.

claviériste
la source
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

Thomas J Younsi
la source
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.

indira
la source
10
Vous pouvez en créer un manuellement à l'aide de l'une des méthodes d'obtention statique de MotionEvent.
azdev