在插入HID类型的usb设备之后,Android设备的输入法被隐藏

    参考文献:

  https://blog.csdn.net/xiaolei10086/article/details/41212845

链接

https://www.jb51.net/article/174851.htm

        公司的一款产品在焊上二维码相关的模块之后输入法直接退出了,不管怎么点都没有办法弹出来。而且在adb  shell下使用lsusb发现,此时多出了一个usb设备,且该设备并不需要用到。把二维码模块相关的GPIO引脚拉低断电之后该usb设备消失,输入法也正常弹出。

        根据以上现象以及去问硬件得出原因是因为二维码模块中也有一个usb的接口,二维码模块上电这个usb模块也跟着接入,且该usb设备是HID类型的USB设备(给二维码模块上电时,读取内核打印日志判断的)。

        查阅资料才知道当HID设备接入Android时,会将上层的一个配置项改掉,——config.keyboard = Configuration.KEYBOARD_QWERTY;一般情况下者这个配置项的值是nokeys,但是当HID设备插入后,这个配置值就变为Configuration.KEYBOARD_QWERTY,这个时候系统会将新的Configuration通知所有程序还有输入法,先前弹出的输入法检测到有外设键盘了,马上隐藏起来。

        所以只需要该这个配置值就ok。

解决方案:

        .\frameworks\base\services\core\java\com\android\server\wm\WindowManagerService.java

中有computeNewConfigurationLocked方法,该方法在插入HID设备时都会被调用,该方法内调用了displayContent.computeScreenConfiguration()方法,其定义在\frameworks\base\services\core\java\com\android\server\wm\DisPlayContent.java中,void computeScreenConfiguration(Configuration config)有以下几句

if (device.getKeyboardType() == InputDevice.KEYBOARD_TYPE_ALPHABETIC) {
    config.keyboard = Configuration.KEYBOARD_QWERTY;
    keyboardPresence |= presenceFlag;
}

if语句表示如果输入设备的键盘类型为KEYBOARD_TYPE_ALPHABETIC,则将keyboard设置为KEYBOARD_QWERTY。所以我们将keyboard直接设置为KEYBOARD_NOKEYS 

if (device.getKeyboardType() == InputDevice.KEYBOARD_TYPE_ALPHABETIC) {
    config.keyboard = Configuration.KEYBOARD_NOKEYS ;
    keyboardPresence |= presenceFlag;
}

这样插入HID设备之后能够正常弹出输入法。

整编重启,问题解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值