zoukankan      html  css  js  c++  java
  • android 模拟点击3

    引用:http://blog.csdn.net/yiyaaixuexi/article/details/6574001

     Android 真机和模拟器的差异问题,是永恒的话题,问不完的为什么,解不完的迷。模拟器的存在,有它的作用,但不要什么都相信模拟器。除非你是Android纯上层应用开发人员或者爱好者,否则我建议你扔掉模拟器。它理想化的引导给我们添了不少麻烦。当然,这也是件好事。最起码,让我有兴趣去寻求答案,让我收获了更多。

          问题的缘由是有个自动化测试的需求,我需要写脚本模拟点击触摸屏的一系列操作,以代替手工测试(话说~遇上连续启动1000次camera并且拍照后退出这种变态测试,你们都是怎么做的?)。以此来证明:头儿,此bug真的解了!

         


        

         Linux上可以通过sendEvent来模拟键盘或者鼠标点击事件,而Android是基于Linux2.6的,所以也可以模拟点击事件。网络文章很多都给出这样一段数据信息,告诉你怎么去实现模拟点击:


    adb shell sendevent /dev/input/event0 3 0 110       //x坐标
    adb shell sendevent /dev/input/event0 3 1 70         //y坐标
    adb shell sendevent /dev/input/event0 1 330 1       //按下状态,准确的说是有压力值
    adb shell sendevent /dev/input/event0 0 0 0           //必要的一行数据
    adb shell sendevent /dev/input/event0 1 330 0       //抬起状态,无压力值
    adb shell sendevent /dev/input/event0 0 0 0           //必要的一行,相当于终止一段完整数据的标致

    用上面的方法可以点击模拟器的(110,70)点,但是,在真机上,却不可以,原因有两点。


        
     ✿ 1.  /dev/input/event0 ×

          模拟器上只有一个/dev/input/event0,但是真机上不是(如果还真是,那你这设备还是别出厂了-_-||)。

    用cat获得的设备对应event信息:

    # cat /proc/bus/input/devices

    I: Bus=0000 Vendor=0000 Product=0000 Version=0000
    N: Name="qtouch-touchscreen"
    P: Phys=
    S: Sysfs=/devices/virtual/input/input5
    U: Uniq=
    H: Handlers=event5
    B: EV=b
    B: KEY=400 0 4 0 0 0 0 0 0 0 0
    B: ABS=2750000 11030003

    "qtouch-touchscreen"不是规定死的event几,话说1234567都有可能,看你设备了。

     

     ✿ 2.  数据类型 ×

          探究原因的时候,通过:

    #adb shell getevent /dev/input/event5 > getvalue

    可以得到:

     0003 0035 000007c8
     0003 0036 00000771
     0003 0038 00000001
     0000 0002 00000000
     0003 0037 00000010
     0000 0000 00000000

    这和我之前所想象的坐标信息不一样,看到c,就知道是16进制数喽,第一反应就是做个10进制的转换。具体怎么转换?

    int main (int argc, char *argv[]) 点点点... (这个.c 还不会写?不会写还不会搜吗?)

    可以得到:

    3 53 1992 
    3 54 1905 
    3 56 1 
    0 2 0 
    3 55 16

    0 0 0

    先不管为什么,做个测试验证下结果:

    adb shell sendevent /dev/input/event5 3 53 1992 
    adb shell sendevent /dev/input/event5 3 54 1905 
    adb shell sendevent /dev/input/event5 3 56 1 
    adb shell sendevent /dev/input/event5 0 2 0 
    adb shell sendevent /dev/input/event5 3 55 16 
    adb shell sendevent /dev/input/event5 0 0 0

    这里提一下,倘若操作的数据特别大,那我们可以利用vi的强大,在脚本中实现批量数据的转换,例如:

    vim '+%normal gg' '+.,$g/^/s//adb shell sendevent //dev//input//event5 /g' '+wq' value

    结果可以实现点击

    既然测试的结果证明那乱七八糟的数是对的,那就必究其缘由!其实问题的根本原因,是因为手里的真机设备已经支持了多点触摸。

    在Android中,多点触摸功能依赖于RawInputEvent.java 中定义的以下几个主要的软件位:

    1. public class RawInputEvent {   
    2.   
    3. ...  
    4.   public static final int ABS_MT_TOUCH_MAJOR = 0x30;   
    5.   
    6.   public static final int ABS_MT_TOUCH_MINOR = 0x31;   
    7.   
    8.   public static final int ABS_MT_WIDTH_MAJOR = 0x32;   
    9.   
    10.   public static final int ABS_MT_WIDTH_MINOR = 0x33;   
    11.   
    12.   public static final int ABS_MT_ORIENTATION = 0x34;   
    13.   
    14.   public static final int ABS_MT_POSITION_X = 0x35;   
    15.   
    16.   public static final int ABS_MT_POSITION_Y = 0x36;   
    17.   
    18.   public static final int ABS_MT_TOOL_TYPE = 0x37;   
    19.   
    20.   public static final int ABS_MT_BLOB_ID = 0x38;   
    21.   
    22. ...  
    23. }  

    在 KeyInputQueue.java 中,系统创建了一个线程,把所有的 Input 事件放入一个队列,在 KeyInputQueue.java 的最后,将多点事件类型转化为单点事件类型,返回一个新的 InputDevice。

    android的开源unit测试框架,发现点击事件在模拟器上和真机上确实有差别。

  • 相关阅读:
    循环移位算法
    关于Java中2.0-1.1!=0.9的问题
    Java基础语法(三)
    Java基础语法(二)
    Java基础语法(一)
    关于Java运行机制
    Java从零开始(前篇)
    关于.ssh目录下的known_hosts文件的补充
    解决 bash cd too many arguments 报错
    Markdown学习笔记(一)
  • 原文地址:https://www.cnblogs.com/sode/p/2961411.html
Copyright © 2011-2022 走看看