扫码抢实现读取二维码信息,本地扫码枪是外接写入设备,本质是监控读写输入,下面介绍下扫码设备读取支付二维码。

1.引入扫码设备辅助类

public class ScanGunKeyEventHelper {private final static long MESSAGE_DELAY = 500;             //延迟500ms,判断扫码是否完成。private StringBuffer mStringBufferResult;                  //扫码内容private boolean mCaps;                                     //大小写区分private final Handler mHandler;private final BluetoothAdapter mBluetoothAdapter;private final Runnable mScanningFishedRunnable;private OnScanSuccessListener mOnScanSuccessListener;private String mDeviceName;public ScanGunKeyEventHelper(OnScanSuccessListener onScanSuccessListener) {mOnScanSuccessListener = onScanSuccessListener ;mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();mStringBufferResult = new StringBuffer();mHandler = new Handler();mScanningFishedRunnable = new Runnable() {@Overridepublic 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(mScanningFishedRunnable);mHandler.post(mScanningFishedRunnable);} else {//延迟post,若500ms内,有其他事件mHandler.removeCallbacks(mScanningFishedRunnable);mHandler.postDelayed(mScanningFishedRunnable, MESSAGE_DELAY);}}}//检查shift键private void checkLetterStatus(KeyEvent event) {int keyCode = event.getKeyCode();if (keyCode == KeyEvent.KEYCODE_SHIFT_RIGHT || keyCode == KeyEvent.KEYCODE_SHIFT_LEFT) {if (event.getAction() == KeyEvent.ACTION_DOWN) {//按着shift键,表示大写mCaps = true;} else {//松开shift键,表示小写mCaps = false;}}}//获取扫描内容private char getInputCode(KeyEvent event) {int keyCode = event.getKeyCode();char aChar;if (keyCode >= KeyEvent.KEYCODE_A && keyCode <= KeyEvent.KEYCODE_Z) {//字母aChar = (char) ((mCaps ? 'A' : 'a') + keyCode - KeyEvent.KEYCODE_A);} else if (keyCode >= KeyEvent.KEYCODE_0 && keyCode <= KeyEvent.KEYCODE_9) {//数字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_BACKSLASH:aChar = mCaps ? '|' : '\\';break;default:aChar = 0;break;}}return aChar;}public interface OnScanSuccessListener {void onScanSuccess(String barcode);}public void onDestroy() {mHandler.removeCallbacks(mScanningFishedRunnable);mOnScanSuccessListener = null;}//部分手机如三星,无法使用该方法
//    private void hasScanGun() {
//        Configuration cfg = getResources().getConfiguration();
//        return cfg.keyboard != Configuration.KEYBOARD_NOKEYS;
//    }//    /**
//     * 扫描枪是否连接
//     * @return
//     */
//    public boolean hasScanGun() {
//
//        if (mBluetoothAdapter == null) {
//            return false;
//        }
//
//        Set<BluetoothDevice> blueDevices = mBluetoothAdapter.getBondedDevices();
//
//        if (blueDevices == null || blueDevices.size() <= 0) {
//            return false;
//        }
//
//        for (Iterator<BluetoothDevice> iterator = blueDevices.iterator(); iterator.hasNext(); ) {
//            BluetoothDevice bluetoothDevice = iterator.next();
//
//            if (bluetoothDevice.getBluetoothClass().getMajorDeviceClass() == BluetoothClass.Device.Major.PERIPHERAL) {
//                mDeviceName = bluetoothDevice.getName();
//                return isInputDeviceExist(mDeviceName);
//            }
//
//        }
//
//        return false;
//
//    }/*** 输入设备是否存在* @param deviceName* @return*/private boolean isInputDeviceExist(String deviceName) {int[] deviceIds = InputDevice.getDeviceIds();for (int id : deviceIds) {if (InputDevice.getDevice(id).getName().equals(deviceName)) {return true;}}return false;}/*** 是否为扫码枪事件(部分机型KeyEvent获取的名字错误)* @param event* @return*/@Deprecatedpublic boolean isScanGunEvent(KeyEvent event) {return event.getDevice().getName().equals(mDeviceName);}}

2. active里面实现代理方法

 //实现上述类接口‘
public class MainActivity extends AppCompatActivity implementsScanGunKeyEventHelper.OnScanSuccessListener
//重写扫码枪识别返回数据
@Overridepublic void onScanSuccess(String barcode) {barCode = barcode;if (barcode != null && recordPrice > 0 && payString.equals("readyPay")) {payDishs();}}//重写捕捉到扫码枪事件@Overridepublic boolean dispatchKeyEvent(KeyEvent event) {mScanGunKeyEventHelper.analysisKeyEvent(event);return true;}
dispatchKeyEvent里面分发事件一定设置 return true,否则扫码枪事件传递到屏幕其他按钮上

android商户扫码枪读取手机二维码相关推荐

  1. android Zxing二维码之读取手机二维码图片

    使用最新(注意这里是使用最新版的基于ZXing3.1封装:https://github.com/xuyisheng/ZXingLib) 功能是很全面的,扫描,生成,读取手机. 在这里只记录下读取手机相 ...

  2. 手机二维码~~~ZXing简介

    本文来自http://blog.csdn.net/hellogv/       最近3G不断在发力,商务部也主动牵头推动移动电子商务的发展,所以,针对企业应用.消费辅助类的J2ME软件将以更快的速度涌 ...

  3. 让你的网站支持手机二维码登录

    如果你的网站能支持二维码登录, 用户打开手机扫描一下, 网页上就立即变为已登录状态了, 是不是很酷? 像腾讯的微信, 手机淘宝等, 都支持用手机扫描二维码登录 Web 版, 极大的方便了用户. 这项技 ...

  4. 主流手机二维码PK——QR VS DM

    "手机一照,你想要的'码'上就能得到."一种黑白相间.纵横交错.形似迷宫的方形条码--二维码,正在全国的手机中迅速蔓延.从超女投票,到易初莲花超市:从深圳"全球通演出季& ...

  5. 手机二维码软件及资源大汇总

    手机二维码大家已不陌生了,把所有关于二维码的软件.生成. 资源搜集整理出,供大家参考,更多http://www.qrwap.com/index.php ●●●二维码五种基本应用的生成 ●生成中国移动标 ...

  6. Yii2实现手机二维码扫一扫登入

    Yii2实现手机二维码扫一扫登入 一 建数据表 scancode randnumber字段存储的是一个随机码,可以用uuid token是一个提取用户信息的字段,说白了就是user表的唯一键,如果不担 ...

  7. 手机二维码业务行业报告

    条码公司调查取样2010 1 30 View more documents from changeself. 报告中一共73页,历经2年多的收集,算得上行业中比较齐全的第一手资料了,下面贴上报告中十几 ...

  8. APIcoud 手机二维码or条码 生成与扫描模块

    APIcoud 手机二维码or条码 生成与扫描模块 刚接触APIcoud 的时候觉得很多模块真的好难,初次接触二维码的时候觉得,生成二维码真的很费劲呢,其实不然,是真的很难,但是APIcoud 已经封 ...

  9. 手机二维码识别软件3秒破译火车票信息

    近日,有网友通过微博提醒:手机二维码识别软件可轻松识别实名制火车票上的二维码包含的个人身份信息,如随意丢弃火车票,可能造成个人信息的泄露.记者调查发现,二维码识别软件可瞬间破译火车票二维码中乘车时间. ...

最新文章

  1. java怎么创建子程序_JVM执行子程序
  2. linux下的C语言开发 GDB的例子
  3. 适合初学者快速入门的Numpy实战全集
  4. 第1章 认识jQuery
  5. 在php中使用kind,KindEditor 4.x在PHP中的应用实例!
  6. 总结UIViewController的view在有navBar和tabBar影响下布局区域的问题
  7. Python 的类的下划线命名有什么不同?
  8. Android 键盘快捷键
  9. 微博分享代码怎么显示自定义来源
  10. 页面加载时,下方内容在上方图片位置闪现
  11. web打印模板神器reportbro—汉化及中文字体配置(上)
  12. DispatcherServlet详细分析
  13. 根据经纬度确定行政区域_基于JavaScript实现高德地图和百度地图提取行政区边界经纬度坐标...
  14. 开发之准备:为目标设备创建映像
  15. 2021年最新WHQL认证申请流程
  16. 李航《统计学习方法》K近邻代码
  17. 从2018年以太坊统计数据看区块链发展趋势
  18. 电商生鲜网站开发(三)——后台开发:商品分类模块-Redis/Swagger/统一身份校验/IDEA技巧
  19. 激光打标机适合什么材料
  20. Java项目:springboot自助售货管理系统

热门文章

  1. Postman做接口测试设置断言
  2. mysql 3358端口_好用的MySQL抓包工具:sniffer-agent
  3. 以史为鉴!美国如何摧毁了日本的芯片产业?
  4. html中div排版布局
  5. 计算机右键无法新建excel,右键新建中没有excel怎么删除_右键新建中没有excel怎么办...
  6. 华硕笔记本X450JB拆机及加装固态硬盘
  7. 论文笔记01——PoseCNN:A Convolutional Neural Network for 6D Object Pose Estimation in Cluttered Scenes
  8. HTML5相关的知识。
  9. 源IP源MAC目的IP目的MAC,在整个网络中的变化
  10. C++随机产生任意类型某个区间范围的随机数