首页 > 解决方案 > android在关键事件上区分蓝牙硬键盘和条形码扫描仪

问题描述

所以我有以下代码可以区分软键盘输入和蓝牙条形码扫描仪......

               if(event.getAction()==KeyEvent.ACTION_DOWN){
                    if(event.getDeviceId()==-1) //from soft keyboard
                        return super.dispatchKeyEvent(event);

                    char pressedKey = (char) event.getUnicodeChar();
                    barCode += pressedKey;
                }
                if (event.getAction()==KeyEvent.ACTION_DOWN && event.getKeyCode() == KeyEvent.KEYCODE_ENTER) {
                    if(event.getDeviceId()==-1) //from keyboard
                        return super.dispatchKeyEvent(event);

                    String giftCardUPC = barCode.replaceAll("[^\\d.]", "");
                    fragmentProShopGiftCard.etUPCCode.setText(giftCardUPC);
                    barCode="";
                }

这个想法是条形码扫描仪有一个设备ID,而软键盘没有。现在的问题是我有一个支持硬蓝牙键盘、软键盘(如果他们不使用硬键盘)以及条形码扫描仪的活动。

有什么方法可以区分 dispatchKeyEvent 上的 2 个硬件设备吗?

标签: android

解决方案


这就是我最终做的事情......我注意到条形码扫描仪的第一个条目始终是 KEYCODE_LEFT_SHIFT 的 KeyCode ......

String barCode = "";
boolean barCodeMode = false;
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
                if(event.getAction()==KeyEvent.ACTION_DOWN){
                    if(event.getDeviceId()==-1) { //from soft keyboard
                        return super.dispatchKeyEvent(event);
                    }else if(event.getKeyCode() == KeyEvent.KEYCODE_SHIFT_LEFT || barCodeMode){ //from barcode scanner
                        barCodeMode = true;
                        char pressedKey = (char) event.getUnicodeChar();
                        barCode += pressedKey;
                    }else{ //from hard keyboard
                        return super.dispatchKeyEvent(event);
                    }
                }
                if (event.getAction()==KeyEvent.ACTION_DOWN && event.getKeyCode() == KeyEvent.KEYCODE_ENTER) {
                    if(event.getDeviceId()==-1) { //from soft keyboard
                        return super.dispatchKeyEvent(event);
                    }else if(barCodeMode){ //from barcode scanner
                        String giftCardUPC = barCode.replaceAll("[^\\d.]", "");
                        fragmentProShopGiftCard.etUPCCode.setText(giftCardUPC);
                        barCode="";
                        barCodeMode = false;
                    }else{ //from hard keyboard
                        return super.dispatchKeyEvent(event);
                    }
                }

            }

推荐阅读