Como simular um evento de toque no Android?


101

Como simular um evento de toque com o Android enquanto fornece as coordenadas X e Y manualmente?


1
Você está obtendo algumas respostas viáveis ​​abaixo, apenas tenha em mente que elas só funcionarão em aplicativos nos quais você pode fazer pequenas modificações. Para outros aplicativos que você não pode modificar, você precisaria de uma plataforma enraizada para injetar eventos.
Chris Stratton

É possível fazer um aplicativo para tocar em x, y a cada 10 segundos e minimizá-lo, mas tocar em x, y continuar?
Dr.jacky de

Verifique minha resposta sem requisitos de root. :)
Anand Varkey Philips

Respostas:


110

O método de Valentin Rocher funciona se você estendeu sua visão, mas se estiver usando um ouvinte de evento, use este:

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 saber mais sobre como obter um objeto MotionEvent, aqui está uma excelente resposta: Android: como criar um MotionEvent?


1
Boa resposta, mas como um iniciante em Android, o OnTouchListener me confundiu. Agora percebo que o ouvinte não é necessário para a simulação. A única coisa necessária é o MotionEvent na segunda metade do seu código.
user1532390

Por que você está adicionando 100 milis ao eventTime? Não funciona se downTime e eventTime forem iguais?
tu-Reintegrar Monica-dor duh

2
@tudor - Apenas para simular um toque real. downTimeseria o momento em que o usuário tocava na tela, enquanto eventTimeneste caso seria quando o usuário levantasse o dedo ( ACTION_UP). Não tenho certeza se ainda funcionará se os dois forem iguais. Você pode testá-lo e postar seus resultados.
azdev

Como devo declarar o objeto de exibição?
TheLogicGuy

ok .. e o gesto de deslizar para a esquerda, direita, superior e inferior .. usando ACTION_MOVE como fazer isso?
Ramesh_D

24

Aqui está um script monkeyrunner que envia toque e arrasta para um aplicativo. Tenho usado isso para testar se meu aplicativo pode lidar com gestos rápidos e repetitivos de deslizamento.

# 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
Você deve usar em MonkeyDevice.DOWN_AND_UPvez de 'DOWN_AND_UP'. ( DOWN_AND_UPé o padrão, então seu código ainda funciona)
ValarDohaeris

Testado em outro dispositivo (Nexus 10), ele simplesmente reinicia logo após a UPação
Equidamoid

Posso usar isso em uma aula sem teste?
Dania,

20

use os comandos adb Shell para simular o evento de toque

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
Ei, e se quiser simular o zoom de pinça usando o comando adb e eu tenho as coordenadas do zoom de pinça
nikhil84

1

Se entendi claramente, você deseja fazer isso de forma programática. Então, você pode usar o método onTouchEvent de Viewe criar um MotionEventcom as coordenadas de que precisa.


1

Você deve dar uma chance ao novo monkeyrunner . Talvez isso resolva seus problemas. Você coloca códigos-chave nele para teste, talvez eventos de toque também sejam possíveis.


1
Por favor, deixe-me saber como instalar o monkeyrunner. adb não está reconhecendo monkeyrunner
indira

Não está relacionado ao macaco excersiser de ui de adb. Você encontrará o monkeyrunner no diretório de ferramentas da revisão 9 do adt.
keyboardsurfer

Verifique também o link que forneci em minha resposta. Isso leva às informações fornecidas pelo Google sobre o monkeyrunner.
keyboardsurfer

Tentei com "./adb shell monkey". Mas não foi possível invocar o evento de toque
indira

Não é adb shell monkeyo monkeyrunner, que é uma ferramenta diferente.
keyboardsurfer

0

Ao usar o Monkey Script, notei que o DispatchPress (KEYCODE_BACK) não está fazendo nada que seja realmente uma merda. Em muitos casos, isso se deve ao fato de que a Activity não consome o evento Key. A solução para este problema é usar uma mistura de script monkey e comando adb shell input em uma sequência.

1 O uso do script monkey proporcionou um ótimo controle de tempo. Espere um certo segundo para a atividade e é uma chamada de bloqueio adb.
2 Finalmente, o envio do evento-chave 4 do shell adb encerrará o APK em execução.

POR EXEMPLO

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


Bem-vindo ao Stack Overflow! Obrigado por postar sua resposta! Certifique-se de ler as Perguntas frequentes sobre autopromoção com atenção. Observe também que é necessário que você publique um aviso de isenção de responsabilidade toda vez que criar um link para seu próprio site / produto. Eu removi o link. Não adicione novamente sem adicionar uma divulgação também.
Andrew Barber

-6

MotionEvent é gerado apenas tocando a tela.


10
Você pode criar um manualmente usando um dos métodos de obtenção estáticos do MotionEvent.
azdev
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.