Як імітувати сенсорну подію в Android?


101

Як імітувати подію на дотик за допомогою Android, одночасно даючи координати X і Y вручну?


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

Чи можна зробити програму торкатися x, y на кожні 10 секунд і мінімізувати її, але торкаючись у x, y продовжувати?
Dr.jacky

Перевірте мою відповідь без кореневих вимог. :)
Anand Varkey Philips

Відповіді:


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 у другій половині коду.
користувач1532390

Чому ви додаєте 100 мільйонів до часу події? Це не працює, якщо downTime та eventTime однакові?
tu-Reinstate Monica-dor duh

2
@tudor - Тільки для імітації справжнього дотику. downTimeбуде час, коли користувач торкнеться екрана вниз, тоді як eventTimeу цьому випадку це буде, коли користувач підніме палець вгору ( ACTION_UP). Я не впевнений, чи все одно це буде працювати, якщо обидва однакові. Ви можете випробувати його і опублікувати свої результати.
azdev

Як я повинен оголосити об’єкт перегляду?
TheLogicGuy

гаразд ... як щодо пальця вліво, вправо, вгорі та внизу .. за допомогою ACTION_MOVE як це зробити?
Ramesh_D

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 Commands для імітації подій на дотик

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 та створити a MotionEventз потрібними координатами.


1

Ви повинні дати новому мавпочку . Можливо, це може вирішити ваші проблеми. Ви кладете в нього ключові коди для тестування, можливо, можливі і сенсорні події.


1
Будь ласка, дайте мені знати, як встановити monkeyrunner. adb не визнає monkeyrunner
indira

Це не пов’язано з мавпою, що експлуатує інтерфейс adb. Ви знайдете monkeyrunner в каталозі інструментів версії 9 adt.
клавішниксерфер

Ознайомтесь також із посиланням, яке я надав у своїй відповіді Це призводить до наданої компанією Google інформації про майстер-майстер.
клавішниксерфер

Я спробував з "./adb shell monkey". Але не вдалося викликати сенсорну подію
Індія

Чи не adb shell monkeyце monkeyrunner, що інший інструмент.
клавішниксерфер

0

Під час використання сценарію мавп я помітив, що DispatchPress (KEYCODE_BACK) нічого не робить, що насправді не висмоктує. У багатьох випадках це пов'язано з тим, що Діяльність не споживає ключової події. Рішення цієї проблеми полягає у використанні суміші сценарію мавпи та команди введення оболонки adb у послідовності.

1 Використання сценарію мавпи дало чудовий контроль за часом. Зачекайте деяку секунду для активності, і це блокує дзвінок adb.
2 Нарешті надсилання ключа введення оболонки adb завершить запущений APK.

EG

adb shell мавпа -p com.my.application -v -v -v -f /sdcard/monkey_script.txt 1
adb shell shell keyevent 4


Ласкаво просимо до переповнення стека! Дякуємо, що опублікували свою відповідь! Будь ласка, уважно прочитайте FAQ щодо самореклами . Також зауважте, що ви зобов’язані публікувати відмову щоразу, коли ви посилаєтесь на свій власний сайт / продукт. Я видалив посилання. Не додайте його назад, не додаючи розкриття.
Ендрю Барбер

-6

MotionEvent створюється лише дотиком до екрана.


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