android14 硬键盘ESC改BACK按键返回无效问题

在之前的android版本中修改外接键盘ESC为BACK按键做返回键使用,直接修改如下代码即可:

diff 复制代码
--- 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里面对按键做了拦截处理。

bash 复制代码
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
java 复制代码
    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键。

bash 复制代码
    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的处理重新编译修改就可以了。

相关推荐
ltlovezh1 小时前
ROI 编码学习指南:Android 与 FFmpeg 的真实实现边界
android·ffmpeg·音视频开发
心前阳光3 小时前
Unity之2021.3.45f2c1发布安卓程序遇到的问题
android·unity·游戏引擎
utf8mb4安全女神4 小时前
MySQL5.7升级到MySQL8.0并进行数据迁移
android
黄林晴4 小时前
Android XR DP4 重磅发布:手机 App 直投眼镜,Compose 原生玩转 3D 内容
android·google io
炼川淬海DB6 小时前
数据库开发规范
android·adb·数据库开发
2501_915918416 小时前
iOS App性能测试工具的实现方法与优化循环指南
android·ios·小程序·https·uni-app·iphone·webview
天天爱吃肉82186 小时前
豆包 vs DeepSeek API 对比分析报告
android·java·大数据·开发语言·功能测试·嵌入式硬件·汽车
问心无愧05137 小时前
ctf show web入门123
android·前端·笔记
想你依然心痛7 小时前
手机远程控制电脑教程:安卓iOS远程桌面推荐、免费工具配置与远程办公技巧
android·智能手机·电脑