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?


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?


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)

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 

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.


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.


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


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.


10
Możesz utworzyć go ręcznie, używając jednej ze statycznych metod pobierania MotionEvent.
— azdev
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.