Usando o ADB para enviar toques para o telefone, mas não posso liberar

2

Eu tenho um HTC 10 que está executando o CM13 Estou tentando enviar eventos de toque para ele por meio de ADB e Enviar Evento Depois de enviar isto:

adb shell
sendevent /dev/input/event6 3 57 0
sendevent /dev/input/event6 3 53 300
sendevent /dev/input/event6 3 54 400
sendevent /dev/input/event6 3 48 5
sendevent /dev/input/event6 3 58 50
sendevent /dev/input/event6 0 2 0
sendevent /dev/input/event6 0 0 0

Eu recebo um clique no telefone, com os toques na tela, vejo que o toque começou, mas que o toque ainda está ativo no telefone.

Com base na minha leitura aqui e here , bem como em outros lugares, parece que tudo o que eu deveria ter que fazer é:

sendevent /dev/input/event6 3 57 -1
sendevent /dev/input/event6 0 2 0
sendevent /dev/input/event6 0 0 0

ou talvez apenas

sendevent /dev/input/event6 3 57 -1
sendevent /dev/input/event6 0 0 0

no entanto, nenhum desses comandos faz com que o toque seja encerrado no telefone.

Eu tentei colocar tudo isso em um script de shell no próprio telefone e executar o script a partir do shell adb, no entanto, isso resultou na mesma coisa. O começo do toque e não o fim.

    
por Chris D 31.01.2017 / 01:16

1 resposta

6

Apesar de não ter seu ambiente, examinei o problema. Existem vários artigos para serem encontrados, como você fez, que sempre parecem trabalho para algumas pessoas mas não para outras. A minha conclusão é que existem diferenças entre combinações de phone-hardware / versão Android / versão SDK que faz com que não haja uma solução para todas as configurações.

Você terá que descobrir o que funciona para você. tendo em mente que uma grande A atualização do software sempre pode enviar você de volta ao ponto de partida.

O método mais simples que eu encontrei é usar o comando input tap x y :

adb shell input tap x y

Nem todas as versões input têm o parâmetro tap , mas iniciando sem argumentos imprimirão todos os parâmetros disponíveis e a sintaxe:

shell@m0:/ $ input
input
usage: input ...
       input text <string>
       input keyevent <key code number or name>
       input [touchscreen|touchpad|touchnavigation] tap <x> <y>
       input [touchscreen|touchpad|touchnavigation] swipe <x1> <y1> <x2> <y2> [duration(ms)]
       input trackball press
       input trackball roll <dx> <dy>

Outra maneira é usar Getevent para registrar os eventos que acontecem quando você toca na tela. Conforme retirado de aqui :

Record a series of events

  1. Set up the pc to record data in a file (/tmp/android-touch-events.log)

    $ adb shell getevent | grep --line-buffered ^/ | tee /tmp/android-touch-events.log
    
  2. do some stuff on the phone
  3. stop the adb command on the pc with ctrl-c

Replay the recorded events

This command will do the hex conversion in awk

$ awk '{printf "%s %d %d %d\n", substr($1, 1, length($1) -1), strtonum("0x"$2), strtonum("0x"$3), strtonum("0x"$4)}' /tmp/android-touch-events.log | xargs -l adb shell sendevent

Cuidado com a pegadinha que o Getevent exibe seus parâmetros em hexadecimal, mas somente aceita entrada em decimal, que o script acima tenta corrigir.

monkeyrunner é outra ferramenta que você pode usar, como demonstrado aqui :

You might want to use monkeyrunner like this:

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

You can also do a drag, start activies etc. Have a look at the api for MonkeyDevice.

Referências:

por 06.02.2017 / 10:08