通过adb将触摸事件发送到设备

时间:2010-12-08 10:29:45

标签: android adb

我正在尝试使用adb shell命令将触摸事件发送到设备,以便我可以为UI测试执行一些基本的自动化操作。我已经在之前的一些主题中讨论了这个问题。

我确认了如何获取活动并使用sendevent,每次触摸发送6个事件(xcoord,ycoord,2用于发布,2用于发布)并且很容易将此信息与sendevent一起使用,但触摸屏设备的getevent命令似乎会产生太多事件。

有人设法将adb的触摸事件发送到设备吗?能否请你分享解决方案。

我正致力于在手机上录制触控事件。之后,我希望将相同的事件作为UI测试的一部分发送回设备。

请帮忙

4 个答案:

答案 0 :(得分:45)

Android附带了一个input命令行工具,可以模拟各种输入事件 要模拟tap,请使用:

input tap x y

使用input远程运行​​adb shell命令

adb shell input tap x y

其他选项包括:

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>

答案 1 :(得分:29)

要发送触摸事件,您需要执行以下操作:

1设置坐标:

adb shell sendevent /dev/input/event2 3 0 x
adb shell sendevent /dev/input/event2 3 1 y

2发送触摸事件(必须有0 0 0对):

adb shell sendevent /dev/input/event2 1 330 1
adb shell sendevent /dev/input/event2 0 0 0

3发送释放手指事件(必须有0 0 0对):

adb shell sendevent /dev/input/event2 1 330 0
adb shell sendevent /dev/input/event2 0 0 0

请注意:

1您可以录制事件:

adb shell getevent

2如果您使用getevent,则所有事件值均为十六进制。

祝你好运, Yahor

答案 2 :(得分:19)

我设法录制了一个会话,并仅用bash和adb重播。

这就是我所做的,我希望它有助于某人。

记录一系列事件

  1. 设置电脑以将数据记录在文件(/tmp/android-touch-events.log

    $ adb shell getevent | grep --line-buffered ^/ | tee /tmp/android-touch-events.log
    
  2. 在手机上做一些事情
  3. 使用ctrl-c
  4. 停止计算机上的adb命令

    重播录制的事件

    此命令将在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
    

答案 3 :(得分:5)

您可能希望使用monkeyrunner,如下所示:

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

你也可以进行拖动,启动活动等。 看看MonkeyDevice的api。