【问题标题】:ADB: drag vs. swipe / manual drag via eventsADB:通过事件拖动与滑动/手动拖动
【发布时间】:2019-02-03 17:23:16
【问题描述】:

我想通过 ADB 以编程方式控制 Android 设备。

由于我必须滚动列表,我尝试通过如下命令滚动:

adb shell input touchscreen swipe 935 500 789 500 1000

这可行,但问题是 Android 添加了弹力/橡皮筋效果。因此,当滑动完成时,它仍然会滚动得更远一些。但是我需要完善像素,所以这种方法不能按我需要的方式工作。即使我将滑动持续时间增加到 3000 毫秒,它也会滚动更多像素。

是否有一个简单的技巧可以告诉 ADB/我的设备“在移动约 500 毫秒后滑动但按住手指,然后松开手指以防止甩动效应”?

我还尝试过手动控制事件。 因此我运行adb getevent,在设备上执行滑动并收集输出:

[...]
/dev/input/event6: 0000 0000 00000000
/dev/input/event6: 0003 0035 000000fb
/dev/input/event6: 0003 0030 0000000a
/dev/input/event6: 0000 0000 00000000
/dev/input/event6: 0003 0035 000000fa
/dev/input/event6: 0003 0030 0000000b
/dev/input/event6: 0000 0000 00000000
/dev/input/event6: 0003 0036 000001b6
/dev/input/event6: 0003 0030 0000000c
/dev/input/event6: 0000 0000 00000000
/dev/input/event6: 0003 0035 000000f9
/dev/input/event6: 0003 0030 0000000d
/dev/input/event6: 0000 0000 00000000
/dev/input/event6: 0003 0035 000000f8
/dev/input/event6: 0003 0030 0000000e
/dev/input/event6: 0000 0000 00000000
/dev/input/event6: 0003 0035 000000f7
/dev/input/event6: 0003 0030 0000000f
/dev/input/event6: 0000 0000 00000000
/dev/input/event6: 0003 0030 00000000
/dev/input/event6: 0003 0039 ffffffff
/dev/input/event6: 0000 0000 00000000
/dev/input/event6: 0003 002f 0000000c
/dev/input/event6: 0003 0039 0000000c
/dev/input/event6: 0003 0035 000000f7
/dev/input/event6: 0003 0036 000001b6
/dev/input/event6: 0000 0000 00000000

我想这应该告诉我我的事件是/dev/input/event6,我假设我需要的事件代码是0035、0036 和0039。

所以我尝试了一下,想出了一个方法,比如:

adb shell sendevent /dev/input/event6 3 53 935
adb shell sendevent /dev/input/event6  0 0 0
adb shell sendevent /dev/input/event6 3 54 500
adb shell sendevent /dev/input/event6  0 0 0
adb shell sendevent /dev/input/event6 3 57 1
adb shell sendevent /dev/input/event6  0 0 0
adb shell sendevent /dev/input/event6 3 53 789
adb shell sendevent /dev/input/event6  0 0 0
adb shell sendevent /dev/input/event6 3 54 500
adb shell sendevent /dev/input/event6  0 0 0
adb shell sendevent /dev/input/event6 3 57 0
adb shell sendevent /dev/input/event6  0 0 0

这也与here 类似。但它根本不起作用,设备上没有任何变化。由于我不知道下一步该尝试什么,或者我的方法是否正确,所以我想问你是否可以告诉我我的错误在哪里。

谢谢!

【问题讨论】:

标签: android adb


【解决方案1】:

问题是sendevent 命令之间的延迟。如果您检查sendevent源代码,它每次打开文件并写入然后关闭。加上两个adb shell 命令之间的延迟。这使得连续发送事件变得如此缓慢,并且您记录的内容不会被复制。

你需要做的是获取sendeventsource code,修改它以尽可能多地获取参数并在你内部打开文件一次,一次解析3个ints并写入直到所有参数解析,关闭文件。您可以看到您录制的内容非常有魅力。

默认发送事件

sendevent /dev/input/event1 3 47 0
sendevent /dev/input/event1 3 57 13578
sendevent /dev/input/event1 1 330 1
sendevent /dev/input/event1 1 325 1

修改发送事件

/data/local/tmp/mysendevent /dev/input/event1 3 47 0 3 57 13578 1 330 1 1 325 1

我曾经做过同样的事情,你可以在这里参考完整的工作-https://github.com/rils/ARP/wiki

【讨论】:

  • 感谢您的回答!但时机不是问题。我仍然一次发送一个命令,但顺序不正确。请参阅我的答案以了解它是如何解决的。
  • 好的,很好。从您有问题的示例中,我认为十进制转换已经处理好了。
【解决方案2】:

耶 - 我终于想通了!

我编写了一个小脚本,将adb shell getevent 转换为十进制值,并用this article 中的已知名称替换代码。

这给了我这样的输出:

/dev/input/event6: 3 - TRACKING_ID [4294967295]
/dev/input/event6: 0 - SYN_REPORT [0]
/dev/input/event6: 3 - 47 [0]
/dev/input/event6: 3 - POSITION_X [415]
/dev/input/event6: 3 - POSITION_Y [428]
/dev/input/event6: 3 - TOUCH_MAJOR [5]
/dev/input/event6: 3 - TRACKING_ID [0]
/dev/input/event6: 0 - SYN_REPORT [0]

然后我能够弄清楚事件是如何工作的,并且可以复制行为。我只需要更改 X 和 Y 坐标。

adb shell sendevent /dev/input/event6 3 57 88
adb shell sendevent /dev/input/event6 3 53 935
adb shell sendevent /dev/input/event6 3 54 500
adb shell sendevent /dev/input/event6 3 48 5
adb shell sendevent /dev/input/event6 0 0 0
adb shell sendevent /dev/input/event6 3 53 906
adb shell sendevent /dev/input/event6 3 54 500
adb shell sendevent /dev/input/event6 3 48 16
adb shell sendevent /dev/input/event6 0 0 0
adb shell sendevent /dev/input/event6 3 53 877
adb shell sendevent /dev/input/event6 3 54 500
adb shell sendevent /dev/input/event6 3 48 16
adb shell sendevent /dev/input/event6 0 0 0
adb shell sendevent /dev/input/event6 3 53 847
adb shell sendevent /dev/input/event6 3 54 500
adb shell sendevent /dev/input/event6 3 48 16
adb shell sendevent /dev/input/event6 0 0 0
adb shell sendevent /dev/input/event6 3 53 818
adb shell sendevent /dev/input/event6 3 54 500
adb shell sendevent /dev/input/event6 3 48 16
adb shell sendevent /dev/input/event6 0 0 0
adb shell sendevent /dev/input/event6 3 53 789
adb shell sendevent /dev/input/event6 3 54 500
adb shell sendevent /dev/input/event6 3 48 16
adb shell sendevent /dev/input/event6 0 0 0
adb shell sendevent /dev/input/event6 3 57 -1
adb shell sendevent /dev/input/event6 0 0 0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多