三星Galaxy Note - 为什么当触控笔触摸/释放屏幕时会生成KeyEvent.KEYCODE_FORWARD_DEL事件?

时间:2012-03-27 02:58:27

标签: android galaxy forward-delete

三星Galaxy Note有一个手写笔,当手写笔触摸/离开屏幕时,我观察到一种奇怪的行为。

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

在触控笔上按下/释放按钮会导致使用KeyEvent代码114(KeyEvent.KEYCODE_CTRL_RIGHT)调用SessionView.onKeyDown / SessionView.onKeyUp,扫描码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

1 个答案:

答案 0 :(得分:0)

您可以看到KEYCODE_FORWARD_DEL是API级别11中的新字段。因此,密钥代码112应该是由Samsung定义的代码。

根据以下代码在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();
        }
    }
}