思路:

重写Activity的dispatchKeyEvent()方法  将获取到的内容自定义处理  然后再回调得到扫描内容

import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.KeyEvent;import android.widget.Toast;public class MainActivity extends AppCompatActivity implements ScannerKeyEventHelper.OnScanSuccessListener {    private ScannerKeyEventHelper mScannerKeyEventHelper;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mScannerKeyEventHelper = new ScannerKeyEventHelper(this);    }    /**     * 截取按键事件 分发给扫描枪解析类     * 这里没有返回true进行事件拦截是由于 业务需要在HTML中input有焦点时自动查询     * @param event     * @return     */    @Override    public boolean dispatchKeyEvent(KeyEvent event) {        mScannerKeyEventHelper.analysisKeyEvent(event);        return super.dispatchKeyEvent(event);    }    /**     * 扫描成功回调     * @param barcode     */    @Override    public void onScanSuccess(String barcode) {        Toast.makeText(MainActivity.this,"扫描枪内容:"+barcode,Toast.LENGTH_SHORT).show();        //根据业务需求处理扫描到的内容    }    @Override    protected void onDestroy() {        mScannerKeyEventHelper.onDestroy();        super.onDestroy();    }}

扫描枪解析类:

public class ScannerKeyEventHelper {    private StringBuffer mStringBufferResult;           //扫描内容    private boolean mCaps;                              //大小写    private final Handler mHandler;    private final Runnable mScanningFinishedRunnable;    private OnScanSuccessListener mOnScanSuccessListener;    public ScannerKeyEventHelper(OnScanSuccessListener onScanSuccessListener){        mOnScanSuccessListener = onScanSuccessListener;        mStringBufferResult = new StringBuffer();        mHandler = new Handler();        mScanningFinishedRunnable = new Runnable() {            @Override            public void run() {                performScanSuccess();            }        };    }    /**     * 扫描成功结果     */    private void performScanSuccess(){        String barcode = mStringBufferResult.toString();        if(mOnScanSuccessListener != null)            mOnScanSuccessListener.onScanSuccess(barcode);        mStringBufferResult.setLength(0);    }    /**     * 扫描事件解析     * @param event     */    public void analysisKeyEvent(KeyEvent event){        int keyCode = event.getKeyCode();        //判断字母大小写        checkLetterStatus(event);        if(event.getAction() == KeyEvent.ACTION_DOWN)        {            char aChar  = getInputCode(event);            if(aChar != 0)            {                mStringBufferResult.append(aChar);            }            if(keyCode == KeyEvent.KEYCODE_ENTER)            {                //回车键 返回                mHandler.removeCallbacks(mScanningFinishedRunnable);                mHandler.post(mScanningFinishedRunnable);            }        }    }    /**     * shift键     * @param keyEvent     */    private void checkLetterStatus(KeyEvent keyEvent){        int keyCode = keyEvent.getKeyCode();        if(keyCode == KeyEvent.KEYCODE_SHIFT_LEFT || keyCode == KeyEvent.KEYCODE_SHIFT_RIGHT)        {            if(keyEvent.getAction() == KeyEvent.ACTION_DOWN)            {                //按住shift键 大写                mCaps = true;            }            else            {                //小写                mCaps = false;            }        }    }    /**     * 获取扫描内容     * @param keyEvent     * @return     */    private char getInputCode(KeyEvent keyEvent){        char aChar;        int keyCode = keyEvent.getKeyCode();        Log.i("TAGKEYCODE",keyCode+"");        if(keyCode >= KeyEvent.KEYCODE_A && keyCode <= keyEvent.KEYCODE_Z)//29< keycode <54        {            //字母            aChar = (char)((mCaps?'A':'a')+keyCode - KeyEvent.KEYCODE_A);//        }        else if (keyCode >= KeyEvent.KEYCODE_0 && keyCode <= KeyEvent.KEYCODE_9)        {            //数字            if(mCaps)//是否按住了shift键            {                //按住了 需要将数字转换为对应的字符                switch (keyCode)                {                    case KeyEvent.KEYCODE_0:                        aChar = ')';                        break;                    case KeyEvent.KEYCODE_1:                        aChar = '!';                        break;                    case KeyEvent.KEYCODE_2:                        aChar = '@';                        break;                    case KeyEvent.KEYCODE_3:                        aChar = '#';                        break;                    case KeyEvent.KEYCODE_4:                        aChar = '$';                        break;                    case KeyEvent.KEYCODE_5:                        aChar = '%';                        break;                    case KeyEvent.KEYCODE_6:                        aChar = '^';                        break;                    case KeyEvent.KEYCODE_7:                        aChar = '&';                        break;                    case KeyEvent.KEYCODE_8:                        aChar = '*';                        break;                    case KeyEvent.KEYCODE_9:                        aChar = '(';                        break;                    default:                        aChar = ' ';                        break;                }            }            else            {                aChar = (char)('0'+keyCode- KeyEvent.KEYCODE_0);            }        }        else        {            //其他符号            switch (keyCode)            {                case KeyEvent.KEYCODE_PERIOD:                    aChar = '.';                    break;                case KeyEvent.KEYCODE_MINUS:                    aChar = mCaps?'_':'-';                    break;                case KeyEvent.KEYCODE_SLASH:                    aChar = '/';                    break;                case KeyEvent.KEYCODE_STAR:                    aChar = '*';                    break;                case KeyEvent.KEYCODE_POUND:                    aChar = '#';                    break;                case KeyEvent.KEYCODE_SEMICOLON:                    aChar = mCaps?':':';';                    break;                case KeyEvent.KEYCODE_AT:                    aChar = '@';                    break;                case KeyEvent.KEYCODE_BACKSLASH:                    aChar = mCaps?'|':'\\';                    break;                default:                    aChar = ' ';                    break;            }        }        return aChar;    }    public interface OnScanSuccessListener{        void onScanSuccess(String barcode);    }    public void onDestroy(){        mHandler.removeCallbacks(mScanningFinishedRunnable);        mOnScanSuccessListener = null;    }}

 

更多相关文章

  1. android 写布局的时候注意大小写
  2. Android中的onTouch()事件如何区分单击事件和滑动事件
  3. 给Android的音量按钮添加监听事件
  4. android按行读取文件内容的几个方法
  5. android:自定义长按/长点击事件
  6. Android提高篇内容整理
  7. Android在ListView中获得对应行的button点击事件
  8. ListView 输入法框遮挡内容

随机推荐

  1. 01-Vue_常用指令
  2. LVS+KeepAlived+Nginx高可用实现方案
  3. LVS管理工具--ipvsadm
  4. 【Vue框架学习】过滤器、自定义指令、生
  5. Docker从入门到掉坑(三):容器太多,操作好麻
  6. MySQL高可用之mysql+keepalived
  7. Docker从入门到掉坑(二):基于Docker构建Sp
  8. 来探讨一下最近面试问的ThreadLocal问题
  9. Docker 从入门到掉坑
  10. 数据的异构实战(二)手写迷你版同步工程