¿Cómo simular un evento táctil en Android?


101

¿Cómo simular un evento táctil con Android mientras se dan las coordenadas X e Y manualmente?


1
A continuación, obtendrá algunas respuestas viables, solo tenga en cuenta que solo funcionarán en aplicaciones en las que pueda hacer pequeñas modificaciones. Para otras aplicaciones que no puede modificar, necesitaría una plataforma rooteada para inyectar eventos.
Chris Stratton

¿Es posible hacer una aplicación para tocar en x, y cada 10 segundos y minimizarlo, pero continuar tocando en x, y?
Dr.jacky

Verifique mi respuesta sin requisitos de root. :)
Anand Varkey Philips

Respuestas:


110

El método de Valentin Rocher funciona si ha ampliado su vista, pero si está utilizando un detector de eventos, utilice esto:

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

Para obtener más información sobre cómo obtener un objeto MotionEvent, aquí hay una excelente respuesta: Android: ¿Cómo crear un MotionEvent?


1
Buena respuesta, pero como principiante de Android, OnTouchListener me confundió. Ahora me doy cuenta de que el oyente no es necesario para la simulación. Lo único que es necesario es MotionEvent en la segunda mitad de su código.
user1532390

¿Por qué está agregando 100 milis al eventTime? ¿No funciona si downTime y eventTime son lo mismo?
tu-Restablece Monica-dor duh

2
@tudor: solo para simular un toque real. downTimesería el momento en el que el usuario toca la pantalla, mientras que eventTimeen este caso sería cuando el usuario levanta el dedo ( ACTION_UP). No estoy seguro de si funcionará si ambos son iguales. Puede probarlo y publicar sus resultados.
azdev

¿Cómo debo declarar el objeto de vista?
TheLogicGuy

ok ... ¿qué pasa con el gesto de deslizar hacia la izquierda, derecha, arriba y abajo ... usando ACTION_MOVE cómo hacer esto?
Ramesh_D

24

Aquí hay un script de monkeyrunner que envía touch y arrastra a una aplicación. He estado usando esto para probar que mi aplicación puede manejar gestos de deslizamiento rápidos y repetitivos.

# 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
Deberías usar en MonkeyDevice.DOWN_AND_UPlugar de 'DOWN_AND_UP'. ( DOWN_AND_UPes el predeterminado, por lo que su código aún funciona)
ValarDohaeris

Probado en otro dispositivo (Nexus 10), simplemente se reinicia justo después de la UPacción
Equidamoid

¿Puedo usar esto en una clase que no sea de prueba?
Dania

20

use adb Shell Commands para simular el evento táctil

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
Oye, ¿qué pasa si quiero simular el zoom con pellizco usando el comando adb y tengo las coordenadas del zoom con pellizco?
nikhil84

1

Si lo entiendo claramente, quieres hacer esto programáticamente. Luego, puede usar el método onTouchEvent de Viewy crear un MotionEventcon las coordenadas que necesita.


1

Deberías darle una oportunidad al nuevo monkeyrunner . Quizás esto pueda resolver tus problemas. Pones códigos de tecla para probar, tal vez también sean posibles los eventos táctiles.


1
Hágame saber cómo instalar monkeyrunner. adb no reconoce a monkeyrunner
indira

No está relacionado con el mono exagerador de interfaz de usuario de adb. Encontrará monkeyrunner en el directorio de herramientas de la revisión 9 del adt.
keyboardsurfer

También consulte el enlace que he proporcionado en mi respuesta. Esto lleva a la información proporcionada por Google sobre MonkeyRunner.
keyboardsurfer

Probé con "./adb shell monkey". Pero no pude invocar el evento táctil
indira

No es adb shell monkey, es el monkeyrunner, que es una herramienta diferente.
keyboardsurfer

0

Al usar Monkey Script, noté que DispatchPress (KEYCODE_BACK) no hace nada que realmente apesta. En muchos casos, esto se debe al hecho de que la actividad no consume el evento clave. La solución a este problema es utilizar una combinación de script mono y comando de entrada de shell adb en una secuencia.

1 El uso de la escritura mono dio un gran control del tiempo. Espere una cierta cantidad de segundos para la actividad y es una llamada adb de bloqueo.
2 Finalmente, el envío de adb shell input keyevent 4 finalizará la ejecución del APK.

P.EJ

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


¡Bienvenido a Stack Overflow! ¡Gracias por publicar tu respuesta! Asegúrese de leer detenidamente las preguntas frecuentes sobre la autopromoción. También tenga en cuenta que es necesario que publique un descargo de responsabilidad cada vez que enlace a su propio sitio / producto. He eliminado el enlace. No lo vuelva a agregar sin agregar también una revelación.
Andrew Barber

-6

MotionEvent se genera solo tocando la pantalla.


10
Puede crear uno manualmente utilizando uno de los métodos de obtención estática de MotionEvent.
azdev
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.