我想通过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/event6
,0035
和0036
。
所以我尝试了一下,并提出了类似的方法:
0039
这也类似here。但是它根本不起作用,设备上没有任何变化。由于我不知道下一步该怎么做,或者我的方法根本不正确,所以我想问你是否可以告诉我我的错误在哪里。
谢谢!
答案 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