代码之家  ›  专栏  ›  技术社区  ›  josef

如何停止Android以捕获key code_f2和keycode_f4?

  •  1
  • josef  · 技术社区  · 6 年前

    我正在尝试捕获设备上可用的硬件键盘上的所有键。这个设备带有功能键(至少我可以将硬件键映射到Fire F2和F4)。

    每次按F2或F4时,设备都使用分配给这些键的系统功能。对于F2,它暂停(休眠)设备,而F4显示应用程序切换屏幕。

    我可以得到从F1到F10的所有其他功能键,除了那些F2和F4。

    adb shell getevent -lt /dev/input/event4
    
        [    1141.537066] EV_MSC       MSC_SCAN             00000000
        [    1141.537096] EV_KEY       KEY_F1               DOWN
        [    1141.537096] EV_SYN       SYN_REPORT           00000000
        [    1141.752672] EV_MSC       MSC_SCAN             00000000
        [    1141.752672] EV_KEY       KEY_F1               UP
        [    1141.752703] EV_SYN       SYN_REPORT           00000000
        [    1143.004565] EV_MSC       MSC_SCAN             00000001
        [    1143.004565] EV_KEY       KEY_F2               DOWN
        [    1143.004595] EV_SYN       SYN_REPORT           00000000
        [    1143.202959] EV_MSC       MSC_SCAN             00000001
        [    1143.202990] EV_KEY       KEY_F2               UP
        [    1143.202990] EV_SYN       SYN_REPORT           00000000
        [    1144.610461] EV_MSC       MSC_SCAN             00000002
        [    1144.610461] EV_KEY       KEY_F3               DOWN
        [    1144.610491] EV_SYN       SYN_REPORT           00000000
        [    1144.808031] EV_MSC       MSC_SCAN             00000002
        [    1144.808031] EV_KEY       KEY_F3               UP
        [    1144.808062] EV_SYN       SYN_REPORT           00000000
        [    1146.466601] EV_MSC       MSC_SCAN             00000003
        [    1146.466631] EV_KEY       KEY_F4               DOWN
        [    1146.466631] EV_SYN       SYN_REPORT           00000000
        [    1146.670946] EV_MSC       MSC_SCAN             00000003
        [    1146.670977] EV_KEY       KEY_F4               UP
        [    1146.670977] EV_SYN       SYN_REPORT           00000000
    

    在WindowsMobile6设备上,许多F键都有这个问题,但可以通过使用WM SDK中的allkeys(true)轻松解决。

    键是正确生成的,正如我在adb shell getvent中看到的那样…

    在Android Java应用程序中,我需要什么代码才能获得F2和F4?

    更新:代码(尽管标准)

        edit1.setKeyListener(new KeyListener() {
            @Override
            public int getInputType() {
                return  InputType.TYPE_TEXT_FLAG_MULTI_LINE | InputType.TYPE_CLASS_TEXT;
            }
    
            @Override
            public boolean onKeyDown(View view, Editable text, int keyCode, KeyEvent event) {
                String name = getResources().getResourceEntryName(view.getId());
                String action = "onKeyDown";
    
                final String message = "[KeyEvent, {name:" + name +
                        "},{action:" + action +
                        "},{code:" + String.valueOf(keyCode) +
                        "},{chars:" + event.getCharacters() +
                        "},{char:" + event.getUnicodeChar() +
                        "},{scode:" + event.getScanCode() +
                        "}]";
                Log.d(TAG, message);
                addLog(message);
                return false;
            }
    

    完整测试代码 https://github.com/hjgode/KeyTest/blob/master/app/src/main/java/com/example/e841719/keytest/KeyTest.java

    1 回复  |  直到 6 年前
        1
  •  0
  •   josef    6 年前

    问题在于设备的OEM实现将硬件密钥重新映射到其他密钥。

    看起来输入的硬件密钥事件密钥在发送到Android应用程序之前会被转换为密钥睡眠。

    这必须由设备的原始设备制造商解决。

    我用另一个设备进行了测试,该设备有一个带有本机功能键的键盘,应用程序将这些键盘识别为键代码_f2等。在硬件方面,getevent显示的密钥f2 code与设备上的密钥f2 code相同,而设备制造商提供的功能(使用ps/2密钥代码)已将硬件密钥映射到F2。