Android 下收发input事件的工具 getevent 和 sendevent

原创 2016年05月31日 09:38:10
Android 自带了 getevent 和 sendevent,分别用于获取设备报送的事件和模拟产生事件,前者用于辅助设备驱动的验证,后者用于模拟事件进行上层应用的验证。

关于event设备的获取,在 /proc/bus/input/devices 下面:

$ adb shell cat /proc/bus/input/devices

0 getevent和sendevent用法:

$ adb shell getevent -h                                              
Usage: getevent [-t] [-n] [-s switchmask] [-S] [-v [mask]] [-d] [-p] [-i] [-l] [-q] [-c count] [-r] [device]
    -t: show time stamps
    -n: don't print newlines
    -s: print switch states for given bits
    -S: print all switch states
    -v: verbosity mask (errs=1, dev=2, name=4, info=8, vers=16, pos. events=32, props=64)
    -d: show HID descriptor, if available
    -p: show possible events (errs, dev, name, pos. events)
    -i: show all device info and possible events
    -l: label event types and names in plain text
    -q: quiet (clear verbosity mask)
    -c: print given number of events then exit
    -r: print rate events are received

$ adb shell sendevent -h
use: sendevent device type code value

1、模拟发送一个Power键:

$ export KEYCODE_POWER=26
$ input keyevent ${KEYCODE_HOME}
或者:
先获取gpio-keys event的设备接口:
$ adb shell cat /proc/bus/input/devices | grep -A 5 gpio-keys | grep event
H: Handlers=event5

# Press power button(Don't release)
$ adb shell sendevent /dev/input/event5 1 $((0x74)) 1
$ adb shell sendevent /dev/input/event5 0 0 0

# Release power button
$ adb shell sendevent /dev/input/event5 1 $((0x74)) 0
$ adb shell sendevent /dev/input/event5 0 0 0

2、模拟获取Power键的事件

先执行
$ adb shell getevent /dev/input/event5

然后按下power键并观察输出:
按下时:
0001 0074 00000001
0000 0000 00000000

弹起来时:
0001 0074 00000000
0000 0000 00000000

可以看到更好跟我们上面模拟的一样,注,上面那些值是十六进制的,如果想要 更加直观地分析获取的上报事件可以参考 在 Android 通过 get_event 获得 input 设备 上报event 

以上转载自http://blog.csdn.net/hellowxwworld/article/details/10733567

以下为原创部分:

================================================================================================

下面以海思Hi3751V310芯片为例子,讲解下在实际中的使用

130|root@Hi3751V310:/ # getevent -h                                            
Usage: getevent [-t] [-n] [-s switchmask] [-S] [-v [mask]] [-d] [-p] [-i] [-l] [-q] [-c count] [-r] [device]
    -t: show time stamps
    -n: don't print newlines
    -s: print switch states for given bits
    -S: print all switch states
    -v: verbosity mask (errs=1, dev=2, name=4, info=8, vers=16, pos. events=32, props=64)
    -d: show HID descriptor, if available
    -p: show possible events (errs, dev, name, pos. events)
    -i: show all device info and possible events
    -l: label event types and names in plain text
    -q: quiet (clear verbosity mask)
    -c: print given number of events then exit
    -r: print rate events are received

问题:最近遇到一个问题:就是电视机的前面板按键中信号源键没有作用,而红外遥控器上是可以的。在串口中敲getevent,按键前面板按键中的信源键

130|root@Hi3751V310:/ # getevent                                               
add device 1: /dev/input/event3
  name:     "Hi Keypad"
could not get driver version for /dev/input/mouse1, Not a typewriter
add device 2: /dev/input/event2
  name:     "qwerty"
could not get driver version for /dev/input/mouse0, Not a typewriter
add device 3: /dev/input/event1
  name:     "Hi mouse"
add device 4: /dev/input/event0
  name:     "Hi keyboard"
could not get driver version for /dev/input/mice, Not a typewriter
/dev/input/event3: 0001 00fa 00000001
/dev/input/event3: 0001 00fa 00000000
/dev/input/event3: 0000 0000 00000000

对比下红外遥控器,按下信源键

/dev/input/event0: 0001 00fa 00000001
/dev/input/event0: 0000 0000 00000000
/dev/input/event0: 0001 00fa 00000000
/dev/input/event0: 0000 0000 00000000

分析可得:红外和前面板getevent事件报上来都是fa,在红外上的可以正常使用,说明android框架层的按键适配没有问题。

                两者的区别是一个是/dev/input/event3    /dev/input/event0

我们在串口中敲getevent -v

130|root@Hi3751V310:/ # getevent -v                                            
add device 1: /dev/input/event3
  bus:      0006
  vendor    046d
  product   0002
  version   0000
  name:     "Hi Keypad"
  location: ""
  id:       ""
  version:  1.0.1
add device 2: /dev/input/event2
  bus:      0000
  vendor    0000
  product   0000
  version   0100
  name:     "qwerty"
  location: ""
  id:       ""
  version:  1.0.1
add device 3: /dev/input/event1
  bus:      0000
  vendor    0001
  product   0002
  version   0100
  name:     "Hi mouse"
  location: ""
  id:       ""
  version:  1.0.1
add device 4: /dev/input/event0
  bus:      0000
  vendor    0001
  product   0001
  version   0100
  name:     "Hi keyboard"
  location: ""
  id:       ""
  version:  1.0.1

   由之前的项目经验知道,在红外按键中,用的keylayout文件是Vendor_0001_Product_0001.kl

   从上面的打印可以推敲处理,前面板按键用的keylayout文件是Vendor_046d_Product_0002.kl

而在板子上的system/usr/keylayout/ 中是没有Vendor_046d_Product_0002.kl这个文件的。

   试着在system/usr/keylayout/ 中增加Vendor_046d_Product_0002.kl,里面的内容和Vendor_0001_Product_0001.kl是一样的,结果发现前面板按键都可以用了。

   说明前面板按键用的是Vendor_046d_Product_0002.kl这个keylayout文件

   那么为什么只会前面板中信号源键不行,其他都可以呢?

   会不会找不到所知道的kl文件时,它就使用了一套默认的keylayout文件,里面除了信号源键外,其他都适配正确的?

   我们可以删除掉Vendor_0001_Product_0001.kl文件,让红外按键查找使用一套默认的keylayout文件。

  果然,红外上除了信号源键,前面板用到的按键都可以的,证明猜想成立。


相关文章推荐

全志A20[android教程]-红外遥控器调试

要在树莓派3 (A20)android系统上实现红外遥控器,因为super3上有红外接收头,所以可以直接支持红外遥控器,可以把树莓派3应用到家庭控制当中。当作网络机顶盒用 树莓派3的红外遥控器,还有鼠...
  • ok138ok
  • ok138ok
  • 2014年03月21日 23:05
  • 10800

android开发模拟click点击事件

在android开发时,button事件一般是需要与用户交互的,即人机交互事件,用户点击时有事件响应,但有时,我们也许会需要模拟点击事件,即不是用户点击,而是程序内部使响应click事件,这时我们可以...

Android App层通过JNI从驱动获取Input Event

1 概述   尝试在App层直接读取驱动的Input Event,获取触屏事件(本文获取的是电磁笔触屏事件),而不通过Android的Input Framework.   ...
  • jack_a8
  • jack_a8
  • 2015年01月25日 13:23
  • 1344

android之getevent/sendevent/input

getevent 旨在获取android设备的事件信息;sendevent 则可以向设备发送模拟事件,其中包括touch和keypress;是否觉得getevent好用好理解,但sendevent却超...

[android] 调试linux input子系统驱动的用户空间命令 getevent/sendevent

在android中getevent/sendevent源码 位置 这两个命令的源码在 system/core/toolbox/下,sendevent.c getevent.c 两个文件。 ge...

Android getevent,sendevent,input keyevent

前言 getevent和sendevent是Android系统自带的获取设备的收发事件和模拟设备事件进行自动话测试。而input keyevent也在自动话测试中有很大的作用,用于模拟常用按键等。接...

android跨进程事件注入(程序模拟用户输入,getevent与sendevent)

android跨进程事件注入(程序模拟用户输入,getevent与sendevent) 早想写这篇,一直没空,现在总结下。 需求: 需要在程序内模拟用户输...

android跨进程事件注入(程序模拟用户输入,getevent与sendevent)

转自http://zuoshu.iteye.com/blog/1775606 早想写这篇,一直没空,现在总结下。 需求: 需要在程序内模拟用户输入,比如点击屏幕,或者输入键盘。模...

2个分析input event事件的开源工具evtest,getevent

文章来源:http://blog.chinaunix.net/uid-20680966-id-4899867.html linux 的/etc/input/eventxx 设备可以用来方便地...
  • jzjhome
  • jzjhome
  • 2017年04月26日 18:38
  • 1369

2个分析input event事件的开源工具evtest,getevent

linux 的/etc/input/eventxx 设备可以用来方便地调试 鼠标、键盘、触摸板等输入设备 有两个开源可用来读取input event事件的值,evtest与getevent(这个是从...
  • eydwyz
  • eydwyz
  • 2016年11月05日 15:57
  • 2341
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android 下收发input事件的工具 getevent 和 sendevent
举报原因:
原因补充:

(最多只允许输入30个字)