web-dev-qa-db-fra.com

Comment simuler un événement tactile sous Android?

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

94
indira

La méthode de Valentin Rocher fonctionne si vous avez étendu votre vue, mais si vous utilisez un écouteur d'événement, 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?

105
azdev

Voici un script monkeyrunner qui envoie une touche et traîne à une application. Je me sers de cela pour vérifier que mon application peut gérer des gestes de balayage 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)
22
Warwick

utiliser les commandes de shell adb 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 
20
Arjun Prakash

Vous devriez donner au nouveau monkeyrunner un essai. Peut-être que cela peut résoudre vos problèmes. Vous y mettez des codes clés à des fins de test, peut-être que des événements tactiles sont également possibles.

1
keyboardsurfer

Si je comprends bien, vous voulez le faire par programmation. Ensuite, vous pouvez utiliser la méthode onTouchEvent de View et créer un MotionEvent avec les coordonnées dont vous avez besoin.

1
Valentin Rocher

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

1 L'utilisation du script Monkey offre un excellent contrôle du minutage. Attendez une certaine quantité de seconde pour l'activité et est un appel bloquant adb.
2 Enfin, l'envoi de l'adb Shell d'entrée keyevent 4 mettra fin à l'APK en cours d'exécution.

PAR EXEMPLE

shell adb monkey -p com.my.application -v -v -v -f /sdcard/monkey_script.txt 1
adb Shell input keyevent 4

0
Thomas J Younsi