【问题标题】:Samsung Galaxy Note - why KeyEvent.KEYCODE_FORWARD_DEL events are generated when its stylus touches/releases the screen?三星 Galaxy Note - 为什么在触控笔触摸/释放屏幕时会生成 KeyEvent.KEYCODE_FORWARD_DEL 事件?
【发布时间】:2023-10-10 15:23:01
【问题描述】:

Samsung Galaxy Note 有一支触控笔,当触控笔接触/离开屏幕时,我观察到一种奇怪的行为。

除了预期的一系列 SessionView.onTouchEvent 调用外,当触控笔触摸/离开屏幕时,还会收到 SessionView.onKeyDown/SessionView.onKeyUp 调用。 SessionView.onKeyDown/SessionView.onKeyUp调用的KeyEvent代码为112(KeyEvent.KEYCODE_FORWARD_DEL),扫描码555。

同时按下/释放触控笔上的按钮会导致 SessionView.onKeyDown/SessionView.onKeyUp 调用 KeyEvent 代码 114 (KeyEvent.KEYCODE_CTRL_RIGHT),扫描代码 544。

KeyEvent 的事件源被报告为 257 (InputDevice.SOURCE_KEYBOARD),这使得这与键盘事件无法区分,并扰乱了我们应用中的键盘功能,因为手写笔触摸会产生意外的 DEL 按键。

我想知道是否有人可以进一步了解这种行为。它只是三星开发人员在 Android 2.3 上实现手写笔功能的专有黑客吗?什么是处理这个问题的可靠方法?

设备详情:

Device model: GT-N7000
Firmware version: 2.3.6
Kernel version: 2.6.35.7-N7000XXLA4-CL886827
se.infra@SEP-74 )
#2 SMP PREEMPT Thu Jan 12 21:15:11 KST 2012
Build number: GINGERBREAD.XXLA4

【问题讨论】:

    标签: android galaxy forward-delete


    【解决方案1】:

    您可以看到 KEYCODE_FORWARD_DEL 是 API Level 11 中的一个新字段。因此密钥代码 112 应该是三星定义的代码。

    根据以下代码在方法onKeyDown()中使用Java反射。我们可以得到 112是系统中的KEYCODE_PEN。

    Field[] fields = event.getClass().getDeclaredFields();
    for (Field f : fields) {
        if (f.getType().equals(int.class)) {
            try {
                TLog.i(TAG, f.getName() + ": " + f.getInt(event));
            } catch (IllegalArgumentException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    

    【讨论】: