2

三星 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
4

1 回答 1

0

您可以看到 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();
        }
    }
}
于 2012-04-24T05:04:38.707 回答