¿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?

indira
fuente
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?

azdev
fuente
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)
Warwick
fuente
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 
Arjun Prakash
fuente
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.

Valentin Rocher
fuente
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.

surfista
fuente
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

Thomas J Younsi
fuente
¡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.

indira
fuente
10
Puede crear uno manualmente utilizando uno de los métodos de obtención estática de MotionEvent.
azdev