4

I have a HTC 10 which is running CM13 I am trying to send touch events to it by means of ADB and Send Event After sending this:

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

I get a click on the phone, with showtouches on, I can see the touch has begun, but that the touch is still active on the phone.

Based on my reading here and here as well as other places, it seems all I should have to do is:

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

or maybe even just

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

however, neither of these commands results in the touch being ended on the phone.

I tried putting all of this on a shell script on the phone itself, and running the script from the adb shell, however that resulted in the same thing. The beginning of the touch, and not the end.

1
  • While I'm not sure whether this is the right place to ask this, I do have the same question, so I've placed a bounty on it. – oKtosiTe Feb 7 '17 at 10:09
10
+100

Although not having your environment, I have looked into the issue. There are various articles to be found, as you did, which always seem to work for some people but not for others. It is my conclusion that there are differences between combinations of phone-hardware/Android-version/SDK-version that make it so that there is no one solution for all setups.

You will have to find out what works for you. keeping in mind that a major update of the software can always send you back to the starting point.

The simplest method I have found is to use the input tap x y command :

adb shell input tap x y

Not all input versions have the tap parameter, but starting it without arguments will print all available parameters and the syntax:

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>

Another way is to use Getevent to record the events that happen when you touch the screen. As taken from here:

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

Beware the gotcha that Getevent displays its parameters in hex but only accepts input in decimal, which the above script tries to correct.

monkeyrunner is another tool that you may use, as demonstrated here:

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.

References:

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.