真机于模拟器的区别是,网上一大堆的说明,操作方法都是针对的模拟器,用到真机上,不起作用了.
一般模拟器的事件就一个.
模拟器获取事件信息
root@generic:/ # getevent
add device 1: /dev/input/event0
name: "qwerty2"
就一个/dev/input/event0 因此能搜到的文章都是写的event0
真机就比较多了,如我的这个HTC
有8个设备
# getevent
add device 1: /dev/input/event6
name: "proximity"
add device 2: /dev/input/event5
name: "lightsensor-level"
add device 3: /dev/input/event4
name: "dummy_keypad"
add device 4: /dev/input/event3
name: "pyramid-keypad"
add device 5: /dev/input/event2
name: "cy8c-touchscreen"
add device 6: /dev/input/event1
name: "rcp_events"
add device 7: /dev/input/event0
name: "h2w headset"
add device 8: /dev/input/event7
name: "htc_headset"
需要给手机发送指令,那么就需要知道你摸了手机,是哪个设备相应的
通过getevent很容易
用手点了下
/dev/input/event2: 0003 0030 00000040
/dev/input/event2: 0003 0032 00000040
/dev/input/event2: 0003 0035 00000196
/dev/input/event2: 0003 0036 000002e5
/dev/input/event2: 0000 0002 00000000
/dev/input/event2: 0000 0000 00000000
输出一大堆event2 那么接受点击的就是 /dev/input/event2 这个设备了
点了下开机键
/dev/input/event3: 0001 0074 00000001
/dev/input/event3: 0001 0074 00000000
输出了event3 那么开机键关联的就是 /dev/input/event3 这个设备了
手机的分辨率是540 960
按照这个尺寸获取坐标小心,发送sendevent 是不对的.
通过getevent -p 获取event2的参数信息
add device 5: /dev/input/event2
name: "cy8c-touchscreen"
events:
SYN (0000): 0000 0001 0003
KEY (0001): 0066 008b 009e 00d9
ABS (0003): 0030 value 0, min 0, max 255, fuzz 0 flat 0
0032 value 0, min 0, max 512, fuzz 0 flat 0
0035 value 0, min 11, max 1012, fuzz 0 flat 0
0036 value 0, min 6, max 940, fuzz 0 flat 0
0035的值范围是 11 ---- 1012
540这个尺寸需要调整下按比例缩放.
540/1001 + 11 才是实际映射到事件的尺寸.
通过 getevent -t 查看手机接受的事件信息
25804-683810: /dev/input/event5: 0003 0028 00000002
25804-684206: /dev/input/event5: 0000 0000 00000000
25805-734866: /dev/input/event2: 0003 0030 0000003c
25805-737734: /dev/input/event2: 0003 0032 0000003c
25805-737795: /dev/input/event2: 0003 0035 00000221
25805-737856: /dev/input/event2: 0003 0036 00000120
25805-737917: /dev/input/event2: 0000 0002 00000000
25805-737978: /dev/input/event2: 0000 0000 00000000
事件发送的速度是很快的,是在同意秒内进行处理,
所以你发送sendevent 是跟不上这个节奏的,如果要进行划屏的操作,那么一个一个的发送指令,执行时就成了长按效果了.
因此网上的一堆指令发送是达不到想象的效果的.
非要达到这个效果,那么需要把指令错开,并发执行.
XXXXXXXXXXXXXXXXXX &
sleep XXX
一般通过这样子来模拟并发并且有间隔,但是因为执行时间不固定,因此也还是会存在指令错位导致的异常.
还有一种功能就是通过直接在设备上安装代理,通过agent的方式发送keyevent的方法进行,不过这样实现较复杂.
对于android更高版本的系统input会支持更多的参数,此类设备比较好实现,也不会存在等版本android指令不知道导致使用折中方法导致的问题.