首先要确定按键输入设备是对应/dev/input目录下哪个event,可以通过getevent -v 或者dumpsys input 确认设备使用的 kl 文件,该命令显示值代表内核中的值
红外键值映射
一、自定义Linux键值
路径:device/hisilicon/bigfish/system/ir_user/key_pars/linux_key.h
二、映射到安卓的kl(KeyLayoutFile)文件
2.1 这里最好是使用里面原来没有用到的,linux_key.h里自定义的键值一定要跟着映射.kl里面的键值走,否则可能会出现keycode无上报情况
2.2 它的作用是把底层传上来的键值映射为Android键值
2.3 注意:这里key是关键字,代表这个映射项作为键值映射,中间的数字代表Linux键值,右边代表自定义键值的名字
三、将实际键值转换成keycode
3.1 framework层通过.kl文件将获取的键值转换成实际按键含义后,又会通过KeycodeLabel转换成相应的keycode,具体文件在:frameworks/native / include/android/keycodes.h (enum枚举类中添加)
我这里是自定义了一个ZY_BASE 3000,从3000开始走,BASE+11就代表是keycode 3011
3.2 在frameworks/base / core/res/res/values/attrs.xml下enum也添加
四、上报的安卓键值
路径:frameworks/native / include/input/InputEventLabels.h (KEYCODES[]数组中添加)
五、对应安卓系统键值
路径:frameworks/base / core/java/android/view/KeyEvent.java
六、 在你的key.xml添加你的键值
0xbe41ff00:ff00为遥控器头码,41为遥控器物理键值,be为校验值(反码)。
IAndroid IR实现原理可参考:android 红外遥控器实现原理_zhanxingshan007的博客-CSDN博客_android 红外遥控器
按下遥控器的一个按键后,在系统中的逻辑过程:遥控器的物理键值——>Linux的标准键值——>自定义的字符串——>定义这个字符串——>android标准键值——>android键值上报——>所有上报表中键值判断是否为全局——>(上报成功)。
到此红外遥控器映射关系就结束了,如果要添加键值,可参考此流程修改
蓝牙键值映射
一、需要通过getevent来查看到输入的具体键值是多少
比如0x6c十六进制转换为10进制就是108,这个键值可以在对呀的Generic.kl文件中找到对应的Android键名,从而在KeyEvent.java文件中找到Android键值
七、更新api/current.txt![](https://i-blog.csdnimg.cn/blog_migrate/6014b07fc631222c223457ac0c20d502.png)
这里在你make update-api之后会自动生成
八、在PhoneWindowManager.java给这个键值自定义服务,根据需求来
九、调试
1.红外遥控调试,可通过ir_user命令,运行后操作遥控器,看是否能获取到物理键值, 能够正常获取到说明驱动层功能正常。
2.蓝牙遥控调试,需要通过getevent来查看到输入的具体键值
上面已经写过了,这里不再做过多叙述
3.INPUT KEYEVENT
方式一:可以通过串口输入键值 input keyevent 3011 来测试按键激活,3011为添加的keycode,方式二:通过PhoneWindowManager.java中过滤TAG来验证
串口输入 logcat | grep WindowManager,可以验证kecode是否上报成功
按下按键出现这种打印证明成功,会调用你自己添加的业务逻辑代码,keycode则是你在keycodes.h里面添加的自定义keycode,可以去看看interceptKeyBeforeQueueing()这个方法