Wie simuliere ich ein Touch-Ereignis in Android?

101

Wie simuliere ich ein Touch-Ereignis mit Android, während ich die X- und Y-Koordinaten manuell gebe?

indira
quelle
1
Im Folgenden finden Sie einige praktikable Antworten. Denken Sie jedoch daran, dass diese nur für Anwendungen funktionieren, an denen Sie kleine Änderungen vornehmen können. Für andere Apps, die Sie nicht ändern können, benötigen Sie eine verwurzelte Plattform, um Ereignisse einzufügen.
Chris Stratton
Ist es möglich, eine Anwendung zu erstellen, die alle 10 Sekunden in x, y berührt und minimiert wird, aber die Berührung in x, y wird fortgesetzt?
Dr. Jacky
Überprüfen Sie meine Antwort ohne Root-Anforderungen. :)
Anand Varkey Philips

Antworten:

110

Die Methode von Valentin Rocher funktioniert, wenn Sie Ihre Ansicht erweitert haben. Wenn Sie jedoch einen Ereignis-Listener verwenden, verwenden Sie Folgendes:

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

Weitere Informationen zum Abrufen eines MotionEvent-Objekts finden Sie hier: Android: Wie erstelle ich ein MotionEvent?

Azdev
quelle
1
Gute Antwort, aber als Android-Anfänger hat mich der OnTouchListener verwirrt. Mir ist jetzt klar, dass der Hörer für die Simulation nicht notwendig ist. Das einzige, was notwendig ist, ist das MotionEvent in der zweiten Hälfte Ihres Codes.
Benutzer1532390
Warum fügen Sie der eventTime 100 Millis hinzu? Funktioniert es nicht, wenn downTime und eventTime identisch sind?
tu-Reinstate Monica-dor duh
2
@tudor - Nur um eine echte Berührung zu simulieren. Dies downTimeist die Zeit, in der der Benutzer auf dem Bildschirm aufsetzt, während eventTimein diesem Fall der Benutzer seinen Finger nach oben hebt ( ACTION_UP). Ich bin nicht sicher, ob es noch funktionieren wird, wenn beide gleich sind. Sie können es testen und Ihre Ergebnisse veröffentlichen.
Azdev
Wie soll ich das Ansichtsobjekt deklarieren?
TheLogicGuy
ok .. was ist mit der Wischgeste nach links, rechts, oben und unten .. mit ACTION_MOVE wie geht das?
Ramesh_D
24

Hier ist ein Monkeyrunner-Skript, das Berührungen sendet und an eine Anwendung zieht. Ich habe dies verwendet, um zu testen, ob meine Anwendung schnelle, sich wiederholende Wischgesten verarbeiten kann.

# 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
quelle
1
Sie sollten MonkeyDevice.DOWN_AND_UPanstelle von verwenden 'DOWN_AND_UP'. ( DOWN_AND_UPist die Standardeinstellung, damit Ihr Code immer noch funktioniert)
ValarDohaeris
Versucht auf einem anderen Gerät (Nexus 10), startet es einfach kurz nach der UPAktion neu
Equidamoid
Kann ich dies in einer nicht testenden Klasse verwenden?
Dania
20

Verwenden Sie adb Shell-Befehle, um das Berührungsereignis zu simulieren

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
quelle
1
Hey, was ist, wenn Sie den Pinch-Zoom mit dem Befehl adb simulieren möchten und ich die Koordinaten des Pinch-Zooms habe
nikhil84
1

Wenn ich das klar verstehe, möchten Sie dies programmatisch tun. Anschließend können Sie die onTouchEvent- Methode von verwenden Viewund eine MotionEventmit den von Ihnen benötigten Koordinaten erstellen .

Valentin Rocher
quelle
1

Sie sollten den neuen Monkeyrunner ausprobieren . Vielleicht kann dies Ihre Probleme lösen. Sie geben zum Testen Schlüsselcodes ein, möglicherweise sind auch Berührungsereignisse möglich.

Keyboard-Surfer
quelle
1
Bitte lassen Sie mich wissen, wie man monkeyrunner installiert. adb ist nicht zu erkennen monkeyrunner
indira
Es ist nicht verwandt mit Adbs UI-Exciser-Affe. Sie finden monkeyrunner im Tools-Verzeichnis von Revision 9 der ADT.
Keyboardsurfer
Überprüfen Sie auch den Link, den ich in meiner Antwort angegeben habe. Dies führt zu den von Google bereitgestellten Informationen zum Monkeyrunner.
Keyboardsurfer
Ich habe es mit "./adb shell monkey" versucht. Konnte aber kein Berührungsereignis aufrufen
indira
Es ist nicht adb shell monkeydas monkeyrunner, was ein anderes Werkzeug ist.
Keyboardsurfer
0

Bei der Verwendung von Monkey Script ist mir aufgefallen, dass DispatchPress (KEYCODE_BACK) nichts tut, was wirklich scheiße ist. In vielen Fällen liegt dies daran, dass die Aktivität das Schlüsselereignis nicht verwendet. Die Lösung für dieses Problem besteht darin, eine Mischung aus Monkey-Skript und ADB-Shell-Eingabebefehl in einer Sequenz zu verwenden.

1 Die Verwendung des Affenskripts ermöglichte eine hervorragende Zeitsteuerung. Warten Sie eine bestimmte Sekunde auf die Aktivität und es handelt sich um einen blockierenden AdB-Aufruf.
2 Wenn Sie schließlich den Eingabeschlüssel-Eingabeschlüsselereignis 4 senden, wird die laufende APK beendet.

Z.B

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

Thomas J Younsi
quelle
Willkommen bei Stack Overflow! Vielen Dank für Ihre Antwort! Bitte lesen Sie die FAQ zur Eigenwerbung sorgfältig durch. Beachten Sie auch , dass Sie jedes Mal, wenn Sie auf Ihre eigene Website / Ihr eigenes Produkt verlinken, einen Haftungsausschluss veröffentlichen müssen. Ich habe den Link entfernt. Fügen Sie es nicht wieder hinzu, ohne auch eine Offenlegung hinzuzufügen.
Andrew Barber
-6

MotionEvent wird nur durch Berühren des Bildschirms generiert.

indira
quelle
10
Sie können eine manuell erstellen, indem Sie eine der statischen Abrufmethoden von MotionEvent verwenden.
Azdev