Come simulare un evento touch su Android?


101

Come simulare un evento touch con Android fornendo manualmente le coordinate X e Y?


1
Stai ottenendo alcune risposte praticabili di seguito, tieni presente che funzioneranno solo su applicazioni a cui puoi apportare piccole modifiche. Per altre app che non puoi modificare, avresti bisogno di una piattaforma radicata per iniettare eventi.
Chris Stratton

È possibile fare un'applicazione per toccare in x, y ogni 10 secondi e ridurlo a icona, ma continuare a toccare in x, y?
Dr.jacky

Controlla la mia risposta senza requisiti di root. :)
Anand Varkey Philips

Risposte:


110

Il metodo di Valentin Rocher funziona se hai esteso la tua vista, ma se stai usando un listener di eventi, usa questo:

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

Per ulteriori informazioni su come ottenere un oggetto MotionEvent, ecco un'eccellente risposta: Android: come creare un MotionEvent?


1
Buona risposta, ma come principiante Android OnTouchListener mi ha confuso. Ora mi rendo conto che l'ascoltatore non è necessario alla simulazione. L'unica cosa necessaria è MotionEvent nella seconda metà del codice.
user1532390

Perché stai aggiungendo 100 millisecondi a eventTime? Non funziona se downTime e eventTime sono uguali?
tu-Reinstate Monica-dor duh

2
@tudor - Solo per simulare un tocco reale. downTimesarebbe il momento in cui l'utente tocca lo schermo, mentre eventTimein questo caso sarebbe il momento in cui l'utente solleva il dito ( ACTION_UP). Non sono sicuro se funzionerà ancora se entrambi sono uguali. Potresti testarlo e pubblicare i tuoi risultati.
azdev

Come devo dichiarare l'oggetto vista?
TheLogicGuy

ok .. che dire del gesto di scorrimento verso sinistra, destra, in alto e in basso .. usando ACTION_MOVE come fare?
Ramesh_D

24

Ecco uno script monkeyrunner che invia il tocco e trascina a un'applicazione. L'ho usato per verificare che la mia applicazione sia in grado di gestire gesti rapidi e ripetitivi di scorrimento.

# 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
Dovresti usare MonkeyDevice.DOWN_AND_UPinvece di 'DOWN_AND_UP'. ( DOWN_AND_UPè l'impostazione predefinita, quindi il codice funziona ancora)
ValarDohaeris

Provato su un altro dispositivo (Nexus 10), si riavvia semplicemente subito dopo l' UPazione
Equidamoid

Posso usarlo in una classe non di test?
Dania

20

utilizzare i comandi della shell adb per simulare l'evento touch

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
ehi, che ne dici se vuoi simulare lo zoom pizzico usando il comando adb e ho le coordinate dello zoom pizzico
nikhil84

1

Se ho capito chiaramente, vuoi farlo in modo programmatico. Quindi, puoi usare il metodo onTouchEvent di Viewe creare un MotionEventcon le coordinate che ti servono.


1

Dovresti provare il nuovo monkeyrunner . Forse questo può risolvere i tuoi problemi. Ci metti dei codici chiave per il test, forse sono possibili anche eventi di tocco.


1
Per favore fatemi sapere come installare monkeyrunner. adb non riconosce monkeyrunner
indira

Non è correlato alla scimmia excersiser dell'interfaccia utente di adb. Troverai monkeyrunner nella directory degli strumenti della revisione 9 di adt.
Keyboardsurfer

Controlla anche il link che ho fornito nella mia risposta. Questo porta alle informazioni fornite da Google sul monkeyrunner.
Keyboardsurfer

Ho provato con "./adb shell monkey". Ma non è stato possibile richiamare l'evento touch
indira

Non è adb shell monkeyil monkeyrunner, che è uno strumento diverso.
Keyboardsurfer

0

Quando si utilizza Monkey Script, ho notato che DispatchPress (KEYCODE_BACK) non fa nulla che faccia davvero schifo. In molti casi ciò è dovuto al fatto che l'attività non consuma l'evento chiave. La soluzione a questo problema è usare una combinazione di monkey script e comando di input della shell adb in una sequenza.

1 L'utilizzo di monkey script ha dato un ottimo controllo del tempo. Attendi una certa quantità di secondo per l'attività ed è una chiamata adb di blocco.
2 Infine, l'invio di adb shell input keyevent 4 terminerà l'esecuzione dell'APK.

PER ESEMPIO

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


Benvenuto in Stack Overflow! Grazie per aver pubblicato la tua risposta! Assicurati di leggere attentamente le FAQ sull'autopromozione . Si noti inoltre che è necessario pubblicare un disclaimer ogni volta che si collega al proprio sito / prodotto. Ho rimosso il collegamento. Non aggiungerlo di nuovo senza aggiungere anche una divulgazione.
Andrew Barber

-6

MotionEvent viene generato solo toccando lo schermo.


10
È possibile crearne uno manualmente utilizzando uno dei metodi di acquisizione statici di MotionEvent.
azdev
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.