【问题标题】:ADB shell sendevents not workingADB shell 发送事件不起作用
【发布时间】:2014-04-30 17:34:19
【问题描述】:

我正在尝试使用 getevent/sendevent 机制在我的 android 设备中模拟按键。我看到一个正在运行的批处理文件。所以我知道 adb shell sendevent 机制有效。

所以我做了 adb shell Getvent 并做了一些按键操作,这给了我如下所示的事件:

/

dev/input/event0 0003 0039 0000006c
 /dev/input/event0 0001 014a 00000001
 /dev/input/event0 0001 0145 00000001
 /dev/input/event0 0003 0035 000003f8
 /dev/input/event0 0003 0036 00000153
 /dev/input/event0 0003 0030 00000001
 /dev/input/event0 0003 0031 00000000
 /dev/input/event0 0000 0000 00000000
 /dev/input/event0 0001 014a 00000000
 /dev/input/event0 0001 0145 00000000
 /dev/input/event0 0000 0000 00000000
 /dev/input/event0 0003 0039 0000006d
 /dev/input/event0 0001 014a 00000001
 /dev/input/event0 0001 0145 00000001
 /dev/input/event0 0003 0035 00000278
 /dev/input/event0 0003 0036 0000022c
 /dev/input/event0 0003 0030 00000004
 /dev/input/event0 0003 0031 00000004
 /dev/input/event0 0000 0000 00000000
 /dev/input/event0 0003 0039 ffffffff
 /dev/input/event0 0001 014a 00000000
 /dev/input/event0 0001 0145 00000000
 /dev/input/event0 0000 0000 00000000

所以我复制了相同的事件并从中制作了一个批处理文件,如下所示:

adb shell sendevent  /dev/input/event0 0003 0039 0000006c
adb shell sendevent /dev/input/event0 0001 014a 00000001
adb shell sendevent /dev/input/event0 0001 0145 00000001
adb shell sendevent /dev/input/event0 0003 0035 000003f8
adb shell sendevent /dev/input/event0 0003 0036 00000153
adb shell sendevent /dev/input/event0 0003 0030 00000001
adb shell sendevent /dev/input/event0 0003 0031 00000000
adb shell sendevent /dev/input/event0 0000 0000 00000000
adb shell sendevent /dev/input/event0 0003 0039 ffffffff
adb shell sendevent /dev/input/event0 0001 014a 00000000
adb shell sendevent /dev/input/event0 0001 0145 00000000
adb shell sendevent /dev/input/event0 0000 0000 00000000
adb shell sendevent /dev/input/event0 0003 0039 0000006d
adb shell sendevent /dev/input/event0 0001 014a 00000001
adb shell sendevent /dev/input/event0 0001 0145 00000001
adb shell sendevent /dev/input/event0 0003 0035 00000278
adb shell sendevent /dev/input/event0 0003 0036 0000022c
adb shell sendevent /dev/input/event0 0003 0030 00000004
adb shell sendevent /dev/input/event0 0003 0031 00000004
adb shell sendevent /dev/input/event0 0000 0000 00000000
adb shell sendevent /dev/input/event0 0003 0039 ffffffff
adb shell sendevent /dev/input/event0 0001 014a 00000000
adb shell sendevent /dev/input/event0 0001 0145 00000000
adb shell sendevent /dev/input/event0 0000 0000 00000000

但是当我运行这个批处理文件时,没有模拟事件。我在这里有什么遗漏吗?

【问题讨论】:

  • 在另一个窗口中打开一个单独的 adb 会话,并在尝试批处理文件时在其中运行 getevent
  • 它不显示任何事件。令人惊讶的是,我的批处理文件没有显示任何错误。但是,我刚刚发现 getevent 结果为十六进制,而 SendEvent 只采用十进制。这是否意味着我必须手动翻译所有事件?
  • 可能 - 我记得有类似的限制,但您可以检查工具的来源以确定。使用一个小的自定义程序应该不会太难。即使是电子表格有时也可以成为一次性数据转换项目的便捷工具。
  • 是的,因为它们是少数事件,转换不会花费太多时间。一旦我能够转换并运行,就会更新你
  • 它工作了:)。谢谢:)

标签: android linux bash shell batch-file


【解决方案1】:

我从没想过会是这样,谢谢你的建议。 它现在实际上可以工作,因为我之前使用的是脚本,它只是在字符串中打印十六进制值,python 会进行转换。请注意,此系统比输入抽头版本快得多。我可以以大约 0.3 秒的交错来背靠背发送触摸事件(我仍然不明白为什么它不能处理更快的序列)

这就是我在运行 Android 6.1 的 Nexus 5 上使用 python 的方式:

import os

EV_ABS             = 0x0003
EV_SYN             = 0x0000
ABS_MT_POSITION_X  = 0x0035
ABS_MT_POSITION_Y  = 0x0036
ABS_MT_PRESSURE    = 0x003a
ABS_MT_TOUCH_MAJOR = 0x0030
SYN_REPORT         = 0x0000
ABS_MT_TRACKING_ID = 0x0039

touch_event_id = 1

def touch(x, y):

    global touch_event_id

    event_string =  "sendevent /dev/input/event1 %d %d %d\n" % (EV_ABS, ABS_MT_TRACKING_ID, touch_event_id)
    event_string += "sendevent /dev/input/event1 %d %d %d\n" % (EV_ABS, ABS_MT_POSITION_X,  x)
    event_string += "sendevent /dev/input/event1 %d %d %d\n" % (EV_ABS, ABS_MT_POSITION_Y,  y)
    event_string += "sendevent /dev/input/event1 %d %d %d\n" % (EV_ABS, ABS_MT_PRESSURE,    5)
    event_string += "sendevent /dev/input/event1 %d %d %d\n" % (EV_ABS, ABS_MT_TOUCH_MAJOR, 5)
    event_string += "sendevent /dev/input/event1 %d %d %d\n" % (EV_SYN, SYN_REPORT,         0)

    event_string += "sendevent /dev/input/event1 %d %d %d\n" % (EV_ABS, ABS_MT_TRACKING_ID, -1)
    event_string += "sendevent /dev/input/event1 %d %d %d\n" % (EV_SYN, SYN_REPORT,         0)

    touch_event_id+=1

    os.system('adb shell "%s" &' % event_string)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-04
    • 1970-01-01
    • 1970-01-01
    • 2014-10-13
    • 2011-12-09
    • 1970-01-01
    • 2013-04-02
    • 1970-01-01
    相关资源
    最近更新 更多