• Android模拟屏幕点击input tap替代解决方案


    动机解释

    本来直接使用 adb shell -> input 即可模拟 键盘事件,触屏事件keyevent ,text,tap 
    但是手上的这台目标Android机4.0.3系统的input只支持text和keyevent,不支持tap,无法模拟触屏点击事件.

    usage: input [text|keyevent]
           input text <string>
           input keyevent <event_code>
    

    于是开始寻找模拟触屏的替代解决方案.

    最新的Android API.24模拟器的input支持范围很广:

    Usage: input [<source>] <command> [<arg>...]
    The sources are:
          keyboard
          mouse
          joystick
          touchnavigation
          touchpad
          trackball
          dpad
          stylus
          gamepad
          touchscreen
    
    The commands and default sources are:
          text <string> (Default: touchscreen)
          keyevent [--longpress] <key code number or name> ... (Default: keyboard)
          tap <x> <y> (Default: touchscreen)
          swipe <x1> <y1> <x2> <y2> [duration(ms)] (Default: touchscreen)
    

    press (Default: trackball) 
    roll (Default: trackball)

    参考源码

    参考资料

    事件回放方式

    1. 新建一个.sh脚本(换行符必须为UNIX.LF)
    2. 将捕获到的指定操作的所有event放入脚本
    3. 将event里的数值全部转换为10进制
    4. 在全部event前都加上sendevent 命令

      sendevent /dev/input/event1 1 330 1

    5. 把脚本导入设备

      adb push x.sh /data/local/tmp/x.sh

    6. 执行脚本

      adb shell -> su -> sh /data/local/tmp/x.sh

    7. 观察操作是否正确回放.

    系统键盘,触摸事件捕获方式

    1. Root后的设备
    2. adb shell -> su -> getevent
    3. 在手机屏幕点击某个指定的X,Y坐标位置
    4. 在命令行窗口可见监听到很多event,类似以下内容

      add device 1: /dev/input/event3 
      name: “bma222e” 
      add device 2: /dev/input/event2 
      name: “headset-keyboard” 
      add device 3: /dev/input/event1 
      name: “ft5x0x_ts” 
      add device 4: /dev/input/event0 
      name: “sprd-keypad” 
      /dev/input/event1: 0001 014a 00000001 
      /dev/input/event1: 0003 0030 000000c8 
      /dev/input/event1: 0003 0035 00000015 
      /dev/input/event1: 0003 0036 000002ff 
      /dev/input/event1: 0003 0032 00000001 
      /dev/input/event1: 0000 0002 00000000 
      /dev/input/event1: 0000 0000 00000000 
      /dev/input/event1: 0003 0030 000000c8 
      /dev/input/event1: 0003 0035 00000015 
      /dev/input/event1: 0003 0036 000002ff 
      /dev/input/event1: 0003 0032 00000001 
      /dev/input/event1: 0000 0002 00000000 
      /dev/input/event1: 0000 0000 00000000 
      /dev/input/event1: 0001 014a 00000000 
      /dev/input/event1: 0000 0000 00000000

      event [type] [code] [value] 
      (不同系统版本的手机监听到的内容可能不太一样.单点触控,和多点触控设备事件不一样.) 
      event0:name包含keypad字符串,键盘设备 
      event1:name包含ts字符串,触摸屏设备 
      event2:name包含headset,耳机相关控制设备(猜的)

    5. 通过单变量操作原则,多监听几个类似操作的event
    6. 通过多次回放捕获到的event然后凭经验剔除非关键event
    7. 提取”通用event”,”关键event“,类似以下内容

      /dev/input/event1: 0001 014a 00000001 
      /dev/input/event1: 0003 0030 000000c8 
      /dev/input/event1: 0003 0035 000000f0 
      /dev/input/event1: 0003 0036 00000384 
      /dev/input/event1: 0003 0032 00000001 
      /dev/input/event1: 0000 0002 00000000 
      /dev/input/event1: 0000 0000 00000000 
      /dev/input/event1: 0001 014a 00000000 
      /dev/input/event1: 0000 0000 00000000

      关键event红色部分,分别试验出来对应的是X,Y坐标地址.可把16进制换算成10进制,得到具体数值.

    最小事件集序列尝试

    经过实际真机测试,这个最小序列无法正确触发.看来还是没掌握底层原理.

    下面是两点触摸支持的最小事件集序列:
    
    ABS_MT_TOUCH_MAJOR 0x30
    ABS_MT_POSITION_X 0x35
    ABS_MT_POSITION_Y 0x36
    SYN_MT_REPORT 0x02     //上报第一个点
    ABS_MT_TOUCH_MAJOR
    ABS_MT_POSITION_X
    ABS_MT_POSITION_Y
    SYN_MT_REPORT      //上报第二个点
    SYN_REPORT 0x00        //开始动作
    作者:Asion Tang
    凡是没有注明[转载]的文章,本Blog发表的文章版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    学习第57天
    学习第56天
    学习第55天
    学习第54天
    学习第53天
    学习第52天
    学习第51天
    学习第50天
    MVVM模式
    css盒模型
  • 原文地址:https://www.cnblogs.com/AsionTang/p/6211895.html
Copyright © 2020-2023  润新知