您的位置:首页 > 移动开发 > Android开发

关于Android外设键盘导致系统输入法隐藏的解决方案

2014-11-17 17:41 381 查看


关于Android外设键盘导致系统输入法隐藏的解决方案

 
Android系统发展到今天,如果你还认为它只是应用于手机的话,那你就out了。现在很多企业在通过Android系统来定制他们的相应的设备,比如影院、餐饮等行业应用相当广泛。企业可以根据自己的业务需求,定制一个完全属于自己的、面向客户的Android设备。就拿影院来说,喜欢看电影的朋友都会发现,在各大影院门口都有自助终端设备,方面客户买票,省去了排队的麻烦。这些设备的实现方案多种多样,对应的系统也是百花争艳。由于Android系统开源特性及其维护方便等独到的优势,越来越多的企业都把业务实现方案转向Android平台。
话题可能扯的有点远,主要是想让大家都知道,目前的Android系统应用广泛。那么,既然设备不止局限于手机,有没有朋友会发现,我们的Android设备在交互的时候都会使用外设键盘或其他的方式,很少采取系统软键盘来输入。这就导致了一个问题,当插入外设键盘的时候,系统软键盘就自动隐藏掉了(这里暂且这么认为,其实并没有隐藏,只是我们看不到而已)。那么如何让系统输入法在插入外设键盘的时候不消失咧?
我在做项目的时候也遇到了这个问题,在解决的过程中也走了一些弯路。还是先说说我走的弯路吧。
问题的现象很简单:插入键盘后系统软键盘消失了。要解决的就是插入外设键盘后系统键盘还在。要解决这个问题,首先要清楚Android的系统输入法是怎么调用显示出来的?为什么插入外设HID键盘后就消失了?
当初最笨的想法是去改驱动,屏蔽HID或者USB中关于KEYBOARD的驱动(当初不知道为什么会有这样的想法,也这样去做了,在Linux源码下面修改drivers下面对应的东西,有效果,但是问题没有解决,最终导致所有的USB外设都不可使用)。悲剧了,这条路走不通,又想从Android源码上做文章。
Android的源码下有专门管理输入的管理类,路径:frameworks\base\services\java\com\android\server,叫InputMethodManagerService.java,这个类是所有输入的总管。我当时是这么想的,只要找出来我拔插外设键盘的时候调用的哪些函数,然后再对这些函数做相应的处理,问题就应该可以解决。好吧,开始这里面改,不断的打断点打印日志,一连2天都在这个类里面还有frameworks\base\services\input下面改来改去,反复编译反复试验,最终还是因为其关联的东西太多了,以失败告终。
最后没办法了,只能从输入法本身想办法。经过一番折腾,我发现每一个输入法都跟Configuration有关,这个Configuration有一项keyboard配置项,一般情况下,keyboard的配置值是nokeys,而当我们插入外设键盘的时候,这个配置值就变了,值是Configuration.KEYBOARD_QWERTY,这个时候系统会将新的Configuration通知所有程序还有输入法,先前弹出的输入法检测到有外设键盘了,马上隐藏起来。当时我就想,能不能在Configuration改变的时候,重新给Configuration的keyboard赋值为nokeys,这样应该是可以解决问题的。
方向找到,立马开始实施。找到系统的输入法源码,路径在packages\inputmethods\PinyinIME\src\com\android\inputmethod\pinyin,有一个类叫PinyinIME.java,这个类继承了InputMethodService,所有的输入法都要继承InputMethodService。然后在onConfigurationChanged(Configuration newConfig)方法中加入三句代码:
Configuration config = new Configuration(getResources().getConfiguration());
//修改Configuration,让输入法认为系统中没有外接键盘
config.keyboard = Configuration.KEYBOARD_NOKEYS;
getResources().updateConfiguration(config, getResources().getDisplayMetrics());
然后重新编译整个系统。
果然不出所料,问题引刃而解。
 
 
 
 
 
最后写点感悟:
1.解决这个问题,还是要感谢这篇文章的博主,我是看了这篇文章后才把整个过程搞懂的。网址:http://www.it165.net/pro/html/201406/15445.html。
2.一个人解决问题真的很痛苦,没人交流沟通,成功与失败都得自己扛着。能有个人交流技术,交流经验当然再好不过了,没人交流也不要怕,要坚信方法把问题要多。遇到问题不要想着失败,要坚信一定能成功,顺藤摸瓜,总会有解决办法。
3.问题解决了,自己也进步了,记录下来,为了自己,也为了那些志同道合并且一如自己在这条道上拼搏的朋友们。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: