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.