今天来了一个问题:软键盘无法彈出分析后是因为系统判断当前有外接硬键盘,就会隐藏软键盘但实际情况并不是这么简单,该问题只有在特定条件下偶现具体分析过程就不说了,就是软硬键盘支持上的逻辑问题借着这个机会整理一下键盘检测的过程。
// 如果不是虚拟输入设备会根据输入设备的flags来更新Configuration
// 更新硬件键盘状态
看到这里就比较明确了,在EventHub加载设备时如果输入设备为键盘,并且带有'Q'键就认为这是一個标准的外接键盘。但为何判断'Q'键还不是很清楚
上面说道通过'Q'键来判断是否为外接键盘,这个'Q'键是android键盘的键值键值是否存在是通过一個keylayout文件决定的。kl文件存储在目标系统的/system/usr/keylayout/下系统可以有多个kl文件,根据设备的ID来命名当系统加载键盘设备时,就会根据设备的Vendor ID和Product
键值映射需要使用关键之”key“进行声明之后跟着的数字为Linux驱动中的键值定义,再后面的字符串是android键盘中按键的名称'Q'键是否存在完全取决于kl文件中是否有映射,而不是实际物理键是否存在kl文件的查找也是有一个规则的,其查找顺序如下
有了上面的知识,就可以给出同时支持軟硬键盘的方案
- 修改源码逻辑,设置Configuration中keyboard的值为KEYBOARD_NOKEYS这种Hack其实不好,破坏原生逻辑缺乏移植性。非要这样改的话可以增加对设备的判断,只有特定的键盘设备设置为KEYBOARD_NOKEYS减少副作用。
- 修改keylayout去掉'Q'键映射。有时kl文件写的不标准为了通用把所有键的映射都写上了,实际硬件键卻很少我们就是这种情况。应该按照真实硬件来编写kl文件
另一种方式是在系统启动时在代码中通过接口进行设置。
以上就是本文的全蔀内容希望对大家的学习有所帮助,也希望大家多多支持
}