在之前的android版本中修改外接键盘ESC为BACK按键做返回键使用,直接修改如下代码即可:
--- a/frameworks/base/data/keyboards/Generic.kcm
+++ b/frameworks/base/data/keyboards/Generic.kcm
@@ -499,7 +499,7 @@ key PLUS {
### Non-printing keys ###
key ESCAPE {
- base: none
+ base: fallback BACK
alt, meta: fallback HOME
ctrl: fallback MENU
现在在android14上面发现这样修改后没有效果。查看log,追踪到framework下PhoneWindowManager.java里面对按键做了拦截处理。
09-12 07:06:46.239 734 832 W ContextImpl: Calling a method in the system process without a qualified user: android.app.ContextImpl.sendBroadcast:1319 android.app.ContextImpl.cl
owManager.interceptUnhandledKey:4006 com.android.server.policy.PhoneWindowManager.dispatchUnhandledKey:3912 com.android.server.wm.InputManagerCallback.dispatchUnhandledKey:193
public KeyEvent dispatchUnhandledKey(IBinder focusedToken, KeyEvent event, int policyFlags) {
// Note: This method is only called if the initial down was unhandled.
if (DEBUG_INPUT) {
final KeyInterceptionInfo info =
mWindowManagerInternal.getKeyInterceptionInfoFromToken(focusedToken);
final String title = info == null ? "<unknown>" : info.windowTitle;
Slog.d(TAG, "Unhandled key: inputToken=" + focusedToken
+ ", title=" + title
+ ", action=" + event.getAction()
+ ", flags=" + event.getFlags()
+ ", keyCode=" + event.getKeyCode()
+ ", scanCode=" + event.getScanCode()
+ ", metaState=" + event.getMetaState()
+ ", repeatCount=" + event.getRepeatCount()
+ ", policyFlags=" + policyFlags);
}
if (interceptUnhandledKey(event)) {
return null;
}
上面是打印log的地方,函数里面调用了interceptUnhandledKey。可以看到函数里面对KeyEvent.KEYCODE_ESCAPE做了处理返回了true,导致没有继续上报BACK键。
private boolean interceptUnhandledKey(KeyEvent event) {
final int keyCode = event.getKeyCode();
final int repeatCount = event.getRepeatCount();
final boolean down = event.getAction() == KeyEvent.ACTION_DOWN;
final int metaState = event.getModifiers();
switch(keyCode) {
case KeyEvent.KEYCODE_SPACE:
if (down && repeatCount == 0) {
// Handle keyboard layout switching. (CTRL + SPACE)
if (KeyEvent.metaStateHasModifiers(metaState & ~KeyEvent.META_SHIFT_MASK,
KeyEvent.META_CTRL_ON)) {
int direction = (metaState & KeyEvent.META_SHIFT_MASK) != 0 ? -1 : 1;
sendSwitchKeyboardLayout(event, direction);
return true;
}
}
break;
case KeyEvent.KEYCODE_Z:
if (down && KeyEvent.metaStateHasModifiers(metaState,
KeyEvent.META_CTRL_ON | KeyEvent.META_ALT_ON)) {
// Intercept the Accessibility keychord (CTRL + ALT + Z) for keyboard users.
if (mAccessibilityShortcutController
.isAccessibilityShortcutAvailable(isKeyguardLocked())) {
mHandler.sendMessage(mHandler.obtainMessage(MSG_ACCESSIBILITY_SHORTCUT));
return true;
}
}
break;
case KeyEvent.KEYCODE_SYSRQ:
if (down && repeatCount == 0) {
interceptScreenshotChord(SCREENSHOT_KEY_OTHER, 0 /*pressDelay*/);
}
return true;
case KeyEvent.KEYCODE_ESCAPE:
if (down && repeatCount == 0) {
mContext.closeSystemDialogs();
}
return true;
}
return false;
}
修改屏蔽KeyEvent.KEYCODE_ESCAPE的处理重新编译修改就可以了。