Как смоделировать событие касания в 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)
Warwick
источник
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

Если я четко понимаю, вы хотите сделать это программно. Затем вы можете использовать метод onTouchEventView и создать объект MotionEventс нужными вам координатами.

Валентин Роше
источник
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