Android辅助功能之电源按键作用

2019-07-14 02:48发布

        在Android系统的辅助功能中有个功能为:设置通话过程中按电源键是挂断电话,还是只是做屏幕开关。之前我做4.0寸屏幕的手机时,代码是从兄弟部门拿过来的,这一块本来就是好的。结果这次做4.3寸屏幕从高通直接拿的代码,这个功能没起到作用。不管我是否勾选该选项,通话时按电源键都会挂断电话。这与之前我们其他手机功能就不一致了。不管这个是Google、高通抑或是我们的问题,都必须要解决的。         我首先的思路是键盘映射出错了?在网上用“Android 键盘映射”做关键词搜索,结果都是讲KeyEvent.java文件按键值的。极少部分涉及到了*.kl文件。从这个方向似乎没什么好的线索。百无聊奈的浏览一些网页后,我只能另辟蹊径了。         我分析了setting的应用程序中对辅助功能设置的处理,从代码中理解了该功能实现的原理。即将该设置作为一个判断条件,在通话时通过按键事件来加以处理,判断是开关屏幕,还是挂断电话。那么我只要找到按键事件处理的地方就可以了。通过日志,很快就定位到PowerWindowManager.java文件(我没记错的话)。有一个按键处理函数,对于KEYCODE_POWER做处理。该按键值为26;我看了下这部分代码,这里已经把设置应用中的设置变量作为条件来控制逻辑分支了。如果设置应用执行正确,这里也没有理由出错呀?于是在该按键处理函数入口把打印打开,跟踪日志。发现通话时按电源键接收到的是KEYCOD_ENDCALL(键值为6)。这我就很不理解了。为什么不是我认为的键值26呢?也许还真是键值映射不对导致的。我看了看之前4.0寸手机之前的代码,似乎也是碰到同样的问题。不过其他程序员将KEYCODE_ENDCALL键按照KEYCODE_POWER同样处理了。即在调用电话服务hangup接口前先用设置应用的变量作为条件来判断一下。如果设置了,则挂断电话;否则只是开关屏幕。        从项目进度出发,我只好仿照之前的处理也这样搞了。后面有时间再仔细分析一下为什么读到的键值为6,而不是26了。
       后来有同事分析了这个问题产生的原因:因为按键扫描是在ARM9做的。而ARM9只有一个按键,EndCall也是Power键;通常情况下,ARM9默认EndCall优先。所以每次上报的都是ENDCALL键,而不是POWER键。