Как смоделировать событие касания в Android?


101

Как смоделировать событие касания с Android, задавая координаты X и Y вручную?


1
Ниже вы получите несколько рабочих ответов, но имейте в виду, что они будут работать только с приложениями, в которые вы можете вносить небольшие изменения. Для других приложений, которые вы не можете изменить, вам понадобится рутированная платформа для внедрения событий.
— Крис Стрэттон,

Можно ли сделать так, чтобы приложение касалось x, y каждые 10 секунд и минимизировало его, но при этом касание x, y продолжалось?
— Доктор Джеки

Проверьте мой ответ без корневых требований. :)
— Ананд Варки Филипс

Ответы:


110

Метод Валентина Роше работает, если вы расширили свое представление, но если вы используете прослушиватель событий, используйте это:

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

Чтобы узнать больше о получении объекта MotionEvent, вот отличный ответ: Android: Как создать MotionEvent?


1
Хороший ответ, но меня как новичка в Android смутил OnTouchListener. Теперь я понимаю, что слушатель не нужен для моделирования. Единственное, что необходимо, - это MotionEvent во второй половине вашего кода.
— user1532390

Почему вы добавляете 100 миллисекунд к eventTime? Не работает, если downTime и eventTime совпадают?
— Tu-Reinstate Monica-dor duh

2
@tudor - Только для имитации реального прикосновения. downTimeэто время, когда пользователь касается экрана, в то время как eventTimeв этом случае пользователь поднимает палец вверх ( ACTION_UP). Я не уверен, будет ли он работать, если оба одинаковые. Вы можете протестировать его и опубликовать свои результаты.
— azdev 07

Как мне объявить объект просмотра?
— TheLogicGuy

хорошо .. как насчет жестов смахивания влево, вправо, вверх и вниз .. с помощью ACTION_MOVE, как это сделать?
— Ramesh_D 02

24

Вот сценарий monkeyrunner, который отправляет касание и перетаскивание в приложение. Я использовал это, чтобы проверить, что мое приложение может обрабатывать быстрые повторяющиеся жесты смахивания.

# 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
Вы должны использовать MonkeyDevice.DOWN_AND_UPвместо 'DOWN_AND_UP'. ( DOWN_AND_UPиспользуется по умолчанию, поэтому ваш код все еще работает)
— ValarDohaeris

Пробовал на другом устройстве (Nexus 10), он просто перезагружается сразу после UPдействия
— Equidamoid

Могу ли я использовать это в классе без тестирования?
— Дания

20

используйте команды adb Shell для имитации события касания

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
эй, а как насчет того, чтобы смоделировать масштабирование с помощью команды adb, и у меня есть координаты масштабирования с помощью
— сжатия


1

Вы должны попробовать нового обезьяньего бегуна . Может это решит твои проблемы. Вы помещаете в него коды клавиш для тестирования, возможно, также возможны сенсорные события.


1
Пожалуйста, дайте мне знать, как установить monkeyrunner. ADB не признает monkeyrunner
— Индира

Это не связано с обезьяной-тренингом adb ui. Вы найдете monkeyrunner в каталоге инструментов версии 9 файла adt.
— клавишный

Также проверьте ссылку, которую я предоставил в своем ответе. Это приводит к предоставленной Google информации об обезьянах.
— клавишный

Я пробовал с "./adb shell monkey". Но не удалось вызвать событие касания
— Индира

Это не adb shell monkeyто monkeyrunner, что есть другой инструмент.
— клавишный

0

При использовании Monkey Script я заметил, что DispatchPress (KEYCODE_BACK) ничего не делает, что действительно отстой. Во многих случаях это связано с тем, что Activity не использует событие Key. Решение этой проблемы состоит в том, чтобы последовательно использовать сочетание сценария обезьяны и команды ввода оболочки adb.

1 Использование сценария обезьяны дало отличный контроль времени. Подождите определенное количество секунд для активности и это блокирующий вызов adb.
2 Наконец, отправка ключевого события 4 для ввода оболочки adb завершит выполнение APK.

НАПРИМЕР

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


Добро пожаловать в Stack Overflow! Спасибо, что разместили свой ответ! Не забудьте внимательно прочитать FAQ по саморекламе . Также обратите внимание, что необходимо публиковать отказ от ответственности каждый раз, когда вы ссылаетесь на свой собственный сайт / продукт. Я удалил ссылку. Не добавляйте его обратно, не добавив при этом раскрытия.
— Эндрю Барбер

-6

MotionEvent генерируется только касанием экрана.


10
Вы можете создать его вручную, используя один из статических методов получения MotionEvent.
— azdev 09
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.