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?

Indira
fonte
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?

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

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

tecladista
fonte
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

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

Indira
fonte
10
Você pode criar um manualmente usando um dos métodos de obtenção estáticos do MotionEvent.
azdev