Jak zasymulować zdarzenie dotykowe w systemie Android?

101

Jak zasymulować zdarzenie dotykowe za pomocą Androida, podając ręcznie współrzędne X i Y?

indira
źródło
1
Poniżej znajduje się kilka praktycznych odpowiedzi, ale pamiętaj, że będą działać tylko w aplikacjach, w których możesz wprowadzić niewielkie modyfikacje. W przypadku innych aplikacji, których nie można modyfikować, potrzebna byłaby zrootowana platforma do wstrzykiwania zdarzeń.
Chris Stratton,
Czy jest możliwe, aby aplikacja dotykała w x, y co 10 sekund i minimalizowała, ale dotykanie w x, y było kontynuowane?
Dr Jacky
Sprawdź moją odpowiedź bez wymagań roota. :)
Anand Varkey Philips

Odpowiedzi:

110

Metoda Valentina Rochera działa, jeśli rozszerzyłeś swój widok, ale jeśli używasz detektora zdarzeń, użyj tego:

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

Aby uzyskać więcej informacji na temat uzyskiwania obiektu MotionEvent, oto doskonała odpowiedź: Android: Jak utworzyć MotionEvent?

azdev
źródło
1
Dobra odpowiedź, ale jako początkujący Android OnTouchListener mnie zdezorientował. Teraz zdaję sobie sprawę, że do symulacji nie jest potrzebny słuchacz. Jedyne, co jest konieczne, to MotionEvent w drugiej połowie twojego kodu.
user1532390
Dlaczego dodajesz 100 milis do eventTime? Czy to nie działa, jeśli downTime i eventTime są takie same?
tu-Reinstate Monica-dor duh
2
@tudor - tylko po to, aby zasymulować prawdziwy dotyk. downTimebyłby czas, w którym użytkownik dotyka ekranu, podczas gdy eventTimew tym przypadku byłby to czas, w którym użytkownik podnosi palec w górę ( ACTION_UP). Nie jestem pewien, czy to nadal będzie działać, jeśli oba będą takie same. Możesz to przetestować i opublikować swoje wyniki.
azdev
Jak mam zadeklarować obiekt widoku?
TheLogicGuy
ok… co z gestem przesuwania w lewo, w prawo, w górę i w dół… używając ACTION_MOVE, jak to zrobić?
Ramesh_D
24

Oto skrypt monkeyrunner, który wysyła dotyk i przeciąga do aplikacji. Używam tego do sprawdzenia, czy moja aplikacja obsługuje szybkie, powtarzalne gesty machnięcia.

# 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
źródło
1
Powinieneś użyć MonkeyDevice.DOWN_AND_UPzamiast 'DOWN_AND_UP'. ( DOWN_AND_UPjest to ustawienie domyślne, więc Twój kod nadal działa)
ValarDohaeris
Wypróbowano na innym urządzeniu (Nexus 10), po prostu uruchamia się ponownie zaraz po UPakcji
Equidamoid,
Czy mogę tego używać na zajęciach niebędących testami?
Dania
20

użyj poleceń powłoki adb, aby zasymulować zdarzenie dotykowe

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
źródło
1
hej, a co jeśli chcesz zasymulować powiększenie szczypania za pomocą polecenia adb i mam współrzędne powiększenia szczypania
nikhil84
1

Jeśli dobrze rozumiem, chcesz to zrobić programowo. Następnie możesz użyć metody onTouchEvent programu Viewi utworzyć MotionEventz potrzebnymi współrzędnymi.

Valentin Rocher
źródło
1

Powinieneś dać szansę nowemu monkeyrunnerowi . Może to rozwiąże Twoje problemy. Umieszczasz w nim kody do testów, być może zdarzenia dotykowe są również możliwe.

klawiszowiec
źródło
1
Daj mi znać, jak zainstalować monkeyrunner. adb nie rozpoznaje monkeyrunner
Indira
To nie jest związane z małpą excersiser ui adb. Znajdziesz monkeyrunner w katalogu narzędzi w wersji 9 adt.
keyboardsurfer
Sprawdź również link, który podałem w mojej odpowiedzi. Prowadzi to do dostarczonych przez Google informacji o monkeyrunner.
keyboardsurfer
Próbowałem z „./adb shell monkey”. Ale nie mogłem wywołać wydarzenia dotykowego
indira,
To nie adb shell monkeyjest to monkeyrunner, co jest innym narzędziem.
keyboardsurfer
0

Używając Monkey Script zauważyłem, że DispatchPress (KEYCODE_BACK) nie robi nic, co naprawdę jest do niczego. W wielu przypadkach jest to spowodowane faktem, że działanie nie zużywa zdarzenia klucza. Rozwiązaniem tego problemu jest użycie kombinacji skryptu małpy i polecenia wejściowego powłoki adb w sekwencji.

1 Używanie skryptu małpy dało świetną kontrolę czasu. Poczekaj sekundę na działanie i jest to blokujące wywołanie adb.
2 Na koniec wysłanie keyevent 4 wejścia powłoki adb zakończy działający plik APK.

NA PRZYKŁAD

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

Thomas J Younsi
źródło
Witamy w Stack Overflow! Dziękujemy za przesłanie odpowiedzi! Przeczytaj uważnie często zadawane pytania dotyczące autopromocji . Należy również pamiętać, że jest to konieczne , aby umieścić disclaimer każdym razem, gdy odwołują się do swojej własnej strony / produktu. Usunąłem link. Nie dodawaj go z powrotem bez dodania również ujawnienia.
Andrew Barber,
-6

MotionEvent jest generowane tylko przez dotknięcie ekranu.

indira
źródło
10
Możesz utworzyć go ręcznie, używając jednej ze statycznych metod pobierania MotionEvent.
azdev