Android外接USB扫码枪  https://www.jianshu.com/p/5c1bf3e968e6

USB扫码器实质就是一个外接键盘

客户问题:同一个二维码来扫描,一个视频是在谷歌输入法下测试的,每一次都有不同,另外一个视频是在原生输入法下测试的,没有什么误差

USB扫码器 在使用 GooglePinYin 输入法 打印数据 时会出现 少字符多换行字符等,
是因为输入法键盘符号、数字差异问题。

a.如果demo中用的 建议 自定义拦截键盘事件 不弹出输入法键盘
b.可以更新固件 这边找到合适的输入法了 要更新固件请提出需求

一.ScanKeyManager的拦截键盘事件并将它转化成需要的数据的管理类

package com.gatsby.barcodescanner;

import android.view.KeyEvent;

public class ScanKeyManager {

    private StringBuilder mResult;
    public OnScanValueListener mListener;
    private boolean mCaps;

    public interface OnScanValueListener {
        void onScanValue(String value);
    }

    public ScanKeyManager(OnScanValueListener listener) {
        this.mListener = listener;
        this.mResult = new StringBuilder();
    }

    /**
     * 扫码设备事件解析
     */
    public void analysisKeyEvent(KeyEvent event) {
        int keyCode = event.getKeyCode();
        checkLetterStatus(event);
        if (event.getAction() == KeyEvent.ACTION_DOWN) {
            char aChar = getInputCode(mCaps, event.getKeyCode());
            if (aChar != 0) {
                mResult.append(aChar);
            }
            if (keyCode == KeyEvent.KEYCODE_ENTER) {
                if (mListener != null) {
                    mListener.onScanValue(mResult.toString());
                }
                mResult.delete(0, mResult.length());
            }
        }
    }

    /**
     * 判断大小写
     */
    private void checkLetterStatus(KeyEvent event) {
        int keyCode = event.getKeyCode();
        if (keyCode == KeyEvent.KEYCODE_SHIFT_RIGHT || keyCode == KeyEvent.KEYCODE_SHIFT_LEFT) {
            mCaps = event.getAction() == KeyEvent.ACTION_DOWN;
        }
    }

    /**
     * 将keyCode转为char
     *
     * @param caps    是不是大写
     * @param keyCode 按键
     * @return 按键对应的char
     */
    private char getInputCode(boolean caps, int keyCode) {
        if (keyCode >= KeyEvent.KEYCODE_A && keyCode <= KeyEvent.KEYCODE_Z) {
            return (char) ((caps ? \'A\' : \'a\') + keyCode - KeyEvent.KEYCODE_A);
        } else {
            return keyValue(caps, keyCode);
        }
    }

    /**
     * 按键对应的char表
     */
    private char keyValue(boolean caps, int keyCode) {
        switch (keyCode) {
            case KeyEvent.KEYCODE_0:
                return caps ? \')\' : \'0\';
            case KeyEvent.KEYCODE_1:
                return caps ? \'!\' : \'1\';
            case KeyEvent.KEYCODE_2:
                return caps ? \'@\' : \'2\';
            case KeyEvent.KEYCODE_3:
                return caps ? \'#\' : \'3\';
            case KeyEvent.KEYCODE_4:
                return caps ? \'$\' : \'4\';
            case KeyEvent.KEYCODE_5:
                return caps ? \'%\' : \'5\';
            case KeyEvent.KEYCODE_6:
                return caps ? \'^\' : \'6\';
            case KeyEvent.KEYCODE_7:
                return caps ? \'&\' : \'7\';
            case KeyEvent.KEYCODE_8:
                return caps ? \'*\' : \'8\';
            case KeyEvent.KEYCODE_9:
                return caps ? \'(\' : \'9\';
            case KeyEvent.KEYCODE_NUMPAD_SUBTRACT:
                return \'-\';
            case KeyEvent.KEYCODE_MINUS:
                return \'_\';
            case KeyEvent.KEYCODE_EQUALS:
                return \'=\';
            case KeyEvent.KEYCODE_NUMPAD_ADD:
                return \'+\';
            case KeyEvent.KEYCODE_GRAVE:
                return caps ? \'~\' : \'`\';
            case KeyEvent.KEYCODE_BACKSLASH:
                return caps ? \'|\' : \'\\\';
            case KeyEvent.KEYCODE_LEFT_BRACKET:
                return caps ? \'{\' : \'[\';
            case KeyEvent.KEYCODE_RIGHT_BRACKET:
                return caps ? \'}\' : \']\';
            case KeyEvent.KEYCODE_SEMICOLON:
                return caps ? \':\' : \';\';
            case KeyEvent.KEYCODE_APOSTROPHE:
                return caps ? \'"\' : \'\\'\';
            case KeyEvent.KEYCODE_COMMA:
                return caps ? \'<\' : \',\';
            case KeyEvent.KEYCODE_PERIOD:
                return caps ? \'>\' : \'.\';
            case KeyEvent.KEYCODE_SLASH:
                return caps ? \'?\' : \'/\';
            default:
                return 0;
        }
    }
}

 二.在activity中使用

package com.gatsby.barcodescanner;

import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    private ScanKeyManager scanKeyManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //拦截扫码器回调,获取扫码内容
        scanKeyManager = new ScanKeyManager(new ScanKeyManager.OnScanValueListener() {
            @Override
            public void onScanValue(String value) {
                Log.d("gatsby", "ScanValue->"+value);
            }
        });
    }

    /*监听键盘事件,除了返回事件都将它拦截,使用我们自定义的拦截器处理该事件*/
    @Override
    public boolean dispatchKeyEvent(KeyEvent event) {
        if (event.getKeyCode() != KeyEvent.KEYCODE_BACK) {
            scanKeyManager.analysisKeyEvent(event);
            return true;
        }
        return super.dispatchKeyEvent(event);
    }


}

  

 

版权声明:本文为crushgirl原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/crushgirl/p/14211197.html