有些按键值上层有定义,但是底层并没有定义,驱动反馈定义以后会有问题,这时候为了方便,底层定义现有的按键,然后需要在framework层把按键值转换一下。
起初认为这个应该是在phonewindowmanager.java里去处理,因为通常framework里的按键特殊处理都是在这进行的,心想在这键值替换应该就可以了,通过一顿骚操作,log查看,结果并不任意,log显示phonewindowmanager.java里已经替换成功,可以应用中的键值还是原来的那个自我。好吧,只好继续往前查找,以前一直认为phonewindowmanager中interceptKeyBeforeQueueing数是在phonewindowmanager 中调用的,通过log 发现,其实并不是之前认为的那样,而是在 InputDispatcher.cpp 中调用过来的,于是就可以在这里看看有没有键值可以转换的地方,InputDispatcher.cpp的代码查看和log分析,InputDispatcher::dispatchOnceInnerLocked 这个函数里处理了一些设备的输入信息,
case EventEntry::TYPE_KEY: 这个下面处理的就是按键信息,于是在这加上我们的按键转代码,大功告成
case EventEntry::TYPE_KEY: {
KeyEntry* typedEntry = static_cast<KeyEntry*>(mPendingEvent);
//songjian add
#if defined(ET660_MMI)
int keyCode=typedEntry->keyCode;
switch(keyCode)
{
case 133://f3
keyCode=17;//KeyEvent.KEYCODE_STAR;
break;
case 134:
keyCode=18;//KeyEvent.KEYCODE_POUND;
break;
case 135:
break;
case 136:
keyCode=5;//KeyEvent.KEYCODE_CALL;
break;
case 137://f7
keyCode=6;//KeyEvent.KEYCODE_ENDCALL;
break;
}
typedEntry->keyCode=keyCode;
#endif
//end
if (isAppSwitchDue) {
if (isAppSwitchKeyEventLocked(typedEntry)) {
resetPendingAppSwitchLocked(true);
isAppSwitchDue = false;
} else if (dropReason == DROP_REASON_NOT_DROPPED) {
dropReason = DROP_REASON_APP_SWITCH;
}
}
if (dropReason == DROP_REASON_NOT_DROPPED
&& isStaleEventLocked(currentTime, typedEntry)) {
dropReason = DROP_REASON_STALE;
}
if (dropReason == DROP_REASON_NOT_DROPPED && mNextUnblockedEvent) {
dropReason = DROP_REASON_BLOCKED;
}
done = dispatchKeyLocked(currentTime, typedEntry, &dropReason, nextWakeupTime);
break;
}