【问题标题】:Complex swipes with adb using sendevent in python?在 python 中使用 sendevent 使用 adb 进行复杂的滑动?
【发布时间】:2020-11-24 21:51:48
【问题描述】:

首先我要说我是 adb 的新手。

话虽如此,我正在尝试使用 adb 和 python 模拟对我的 android 设备的复杂滑动。

我到处寻找某种文档或示例,但找不到。我知道这里有人问过类似的问题,但没有一个答案提供了一个实际的例子。

在我的程序中,我使用device.shell("input touchscreen swipe 540 1150 750 1250 500") 进行线性滑动(使用纯python-adb),并且效果很好,但是我不知道如何进行从 a 到 b 然后从 b 到的滑动c 无需抬起“虚拟手指”。

我发现了sendevent,但我完全不明白。我只知道它需要 4 个参数。

例如,谁能告诉我如何产生从 a(200,200) 到 b(200,300) 到 c(300,300) 的滑动?

非常感谢任何帮助。 (注意 - 我使用的是 Windows 10)

【问题讨论】:

  • 您可以记录一次滑动,然后使用 sendevents'input_event 对其进行建模。我写了一篇关于点击here 的博文,但你应该可以录制一次滑动然后重播/建模它

标签: python android adb


【解决方案1】:

您可以使用 sendevent 命令实现此目的。 (在帖子中我解释了它是如何工作的。如果你不关心,你可以使用我制作的this python文件。导入AdbInput类,你基本上完成了)

1º。在您的 adb 终端上获取 root 访问权限:

如果你想使用 sendevent 命令,你需要 root 手机(我不会解释如何 root 你的手机)。生根后,进入你的终端,在你的手机已经连接的情况下,写:adb shell su。您的手机上应该会出现一个弹出窗口,要求您进行 root 访问。允许它,现在您将看到您的 shell 显示 root@[your phone] 而不是来自 'shell@[your phone]'。

2º。查找您的触摸屏的事件。

在 adb 终端(无论是否为 root)中输入“getevent”,然后在运行时触摸手机屏幕。应该出现很多文本和数字。我们正在搜索消息的第一部分,在我的例子中:'/dev/input/event2'(你的将非常相似)。

3º。使用 sendevent 发送触摸事件。

现在,您需要复制从“getevent”命令获得的消息以创建新的触摸事件。我将粘贴实现从 (200, 200) 到 (200, 300) 再到 (300, 300) 的滑动所需的命令,然后解释它们。 (用第 2 步中得到的事件替换“event~”)

device.shell("sendevent /dev/input/event~ 1 330 1")
device.shell("sendevent /dev/input/event~ 3 57 10")
device.shell("sendevent /dev/input/event~ 3 53 200")
device.shell("sendevent /dev/input/event~ 3 54 200")
device.shell("sendevent /dev/input/event~ 0 0 0")
device.shell("sendevent /dev/input/event~ 3 53 200")
device.shell("sendevent /dev/input/event~ 3 54 300")
device.shell("sendevent /dev/input/event~ 0 0 0")
device.shell("sendevent /dev/input/event~ 3 53 300")
device.shell("sendevent /dev/input/event~ 3 54 300")
device.shell("sendevent /dev/input/event~ 0 0 0")
device.shell("sendevent /dev/input/event~ 1 330 0")
device.shell("sendevent /dev/input/event~ 0 0 0")

前两个事件“放下手指”(第一个指定屏幕已被触摸,第二个指定触摸压力)。第三个和第四个事件设置触摸的 x 和 y 位置(都为 200,您可以更改 200s 进行实验)。在每组命令之后需要一个“0 0 0”。接下来的两个设置另一个滑动点,然后是“0 0 0”。下一个发生在接下来的三个中。倒数第二个命令“抬起”手指,最后一个是“0 0 0”事件。

因此,如果您只想点击 (100, 230),您可以输入以下内容:

device.shell("sendevent /dev/input/event~ 1 330 1")     # Puts down finger
device.shell("sendevent /dev/input/event~ 3 57 10")     # Sets pressure
device.shell("sendevent /dev/input/event~ 3 53 100")    # Sets X to 100
device.shell("sendevent /dev/input/event~ 3 54 230")    # Sets Y to 230
device.shell("sendevent /dev/input/event~ 0 0 0")       # "0 0 0" (its called a SYN_REPORT)
device.shell("sendevent /dev/input/event~ 1 330 0")     # Lift up finger
device.shell("sendevent /dev/input/event~ 0 0 0")       # "0 0 0"

就是这样!!你完成了!

【讨论】:

  • 你知道如何使用 sendevent 指定滑动的持续时间吗?像你一样,当使用 shell 输入时滑动:input [touchscreen|touchpad|touchnavigation] swipe <x1> <y1> <x2> <y2> [duration(ms)]shell input swipe 300 400 300 200 2000 其中 2000 代表 2 秒的持续时间。
  • 您可以使用“时间”之类的库,并在“0 0 0”事件之后添加time.sleep(2)。这将在动作之间添加 2 秒的暂停(它将开始滑动,等待 2 秒,继续到下一个点,依此类推)。如果要使滑动顺畅,则需要沿滑动路径添加额外的点以使其停止。
  • 是的,我的目标是让它顺畅,我已经尝试过睡眠,但它只是暂停然后立即滑动,如果你可以查看我的个人资料,我提出了一个关于它的问题!跨度>
猜你喜欢
  • 2022-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-31
  • 1970-01-01
  • 2011-04-03
相关资源
最近更新 更多