亚行:拖动与滑动/通过事件手动拖动

时间:2019-02-03 17:23:16

标签: android adb

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

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

result<-lapply(dplyr::starwars$name[1:3], function(x){
  lapply(dplyr::starwars$name[2:4], function(y){
if(x!=y) paste(x,'&',y) else NULL
  })
})
unlist(result)

这可行,但是问题是Android添加了弹起/橡皮筋效果。因此,完成滑动后,它仍会进一步滚动。但是我需要对像素进行完美处理,以便这种方法无法按我需要的方式工作。即使将滑动时间增加到3000ms,它也会滚动更多像素。

是否可能有一个简单的技巧来告诉ADB /我的设备“滑动但在移动手指大约500ms之后按住手指,然后释放手指以防止窜动效果”?

我还尝试了手动控制事件。 因此,我运行了adb shell input touchscreen swipe 935 500 789 500 1000 ,在设备上滑动并收集了输出:

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/event600350036

所以我尝试了一下,并提出了类似的方法:

0039

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

谢谢!

2 个答案:

答案 0 :(得分:1)

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

您需要做的是获取sendevent source code,对其进行修改以获取尽可能多的arg,然后在您的文件中一次打开文件,一次解析3个int并写入,直到解析所有arg,然后关闭文件。您可以看到录制的内容就像魅力一样。

  

默认sendevent

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
  

修改后的sendevent

/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

答案 1 :(得分:0)

是的-我终于想出了办法!

我写了一个小脚本,将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