Samsung Galaxy Note-为什么当其触控笔触摸/释放屏幕时会生成KeyEvent.KEYCODE_FORW



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

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

按下/释放手写笔上的按钮也会导致SessionView.onKeyDown/SessionView.on KeyUp调用,KeyEvent代码为114(KeyEvent.KEYCODE_CTRL_RIGHT),扫描代码为544。

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

我想知道是否有人能对这种行为有更多的了解。这只是三星开发者在安卓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

您可以看到KEYCODE_FORWARD_DEL是API 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();
        }
    }
}

最新更新