¿Cómo usar ADB para enviar eventos táctiles al dispositivo usando el comando sendevent?


Estoy tratando de enviar eventos táctiles a un dispositivo usando AndroidDebugBridge, para que pueda realizar algunas pruebas básicas de automatización de la interfaz de usuario. He seguido la discusión en ENLACE . Puedo usar sendevent para simular touch en emuladores, pero no puedo hacer lo mismo en un dispositivo.

Al igual que en el enlace anterior, el emulador parece enviar 6 eventos para cada toque (xcoord, ycoord, 2 para prensa, 2 para lanzamiento) y fue fácil usar esta información para sendevents, pero un getevent para el la pantalla táctil de un dispositivo parece generar demasiados eventos.

¿Alguien ha logrado enviar touch desde ADB a un dispositivo? Podría por favor compartir la solución.

Author: Elist, 2010-08-09

5 answers

Android viene con una herramienta de línea de comandos input que puede simular varios eventos de entrada. Para simular tapping, es:

input tap x y

Puede usar el shell adb (>2.3.5) para ejecutar el comando de forma remota:

adb shell input tap x y
 102
Author: user643154,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-20 15:25:57

Para realizar una acción en particular (por ejemplo, para abrir el navegador web), primero debe averiguar dónde tocar. Para hacer eso, primero puede ejecutar:

adb shell getevent -l

Una vez que presione en el dispositivo, en la ubicación que desee, verá esta salida:

<...>
/dev/input/event3: EV_KEY       BTN_TOUCH            DOWN
/dev/input/event3: EV_ABS       ABS_MT_POSITION_X    000002f5
/dev/input/event3: EV_ABS       ABS_MT_POSITION_Y    0000069e

Adb le está diciendo que se presionó una tecla (botón abajo) en la posición 2f5, 69e en hexadecimal que es 757 y 1694 en decimal.

Si ahora desea generar el mismo evento, puede usar el comando input tap al mismo tiempo posición:

adb shell input tap 757 1694

Puede encontrar más información en:

Https://source.android.com/devices/input/touch-devices.html http://source.android.com/devices/input/getevent.html

 42
Author: Tomas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-10 17:20:08

2.3.5 no tenía input tap, solo input keyevent y input text Puedes usar el monkeyrunner para ello: (esta es una copia de la respuesta en https://stackoverflow.com/a/18959385/1587329):

Es posible que desee utilizar monkeyrunner así:

$ monkeyrunner
>>> from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice
>>> device = MonkeyRunner.waitForConnection()
>>> device.touch(200, 400, MonkeyDevice.DOWN_AND_UP)

También puede hacer un arrastre, iniciar actividades, etc. Echa un vistazo a la api de MonkeyDevice.

 10
Author: serv-inc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:10:31

Considere usar el uiautomator de Android , con adb shell uiautomator [...] o directamente usando el .jar que viene con el SDK.

 4
Author: Elist,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-16 10:17:07

No es necesario utilizar

Adb shell getevent-l

Comando, solo tiene que habilitar en las opciones de desarrollador en el dispositivo [Mostrar datos táctiles] para obtener X e Y.

Puede encontrar más información en mi artículo aquí: https://mobileqablog.wordpress.com/2016/08/20/android-automatic-touchscreen-taps-adb-shell-input-touchscreen-tap/

 4
Author: Ekaterina Vlasova,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-21 13:22:42