扫码枪是如何工作的,安卓如何怎么获取扫码枪的内容。本文将介绍安卓获取和处理商米收银机扫码枪扫描后的内容。包括:“安卓开发获取扫码枪扫描后的内容”、“处理扫码枪扫描后的内容”、“在Fragment中使用ScanGun类”。

1、安卓开发获取扫码枪扫描后的内容。

扫码枪会将扫描出来的内容转化为键盘事件KeyEvent,所以我们在fragment类中重写onKeyDownChild方法,就可以捕获扫码事件,进而获取扫码内容:

public void onKeyDownChild(int keyCode, KeyEvent event) {log.info("---------------------------------onKeyDown:    KeyCode:" + keyCode + "------event:" + event + "------------------------------------");scanGun.isMaybeScanning(keyCode, event);
}

2、处理扫码枪扫描后的内容。

SanGun类定义一个isMayBeScanning方法,扫码枪扫描后触发键盘事件,在键盘事件中调用isMayBeScanning方法,进而解析获取扫码内容:

查看代码
package com.bx.erp.helper;import android.view.KeyEvent;import org.apache.log4j.Logger;public class ScanGun {private Logger log = Logger.getLogger(this.getClass());/*** 默认按键之间时间间隔*/public final static int MAX_KEYS_INTERVAL_DEFAULT = 200;private long currentTime = 0;private boolean isKeySHIFT = false;private StringBuilder stringBuilder = new StringBuilder();private ScanGunCallBack callBack = null;private static int maxKeysInterval = MAX_KEYS_INTERVAL_DEFAULT;/*** 设置按键事件的最大时间间隔(部分扫描枪稍大,建议范围20--100)** @param interval 时间间隔*/public static void setMaxKeysInterval(int interval) {maxKeysInterval = interval;}public ScanGun(ScanGunCallBack callBack) {this.callBack = callBack;}public ScanGun() {}public boolean isMaybeScanning(int keyCode, KeyEvent event) {log.info("isMaybeScanning--");log.info("event.getFlags:" + event.getFlags());if (event.getFlags() != 0x8 && event.getFlags() != 0x6) {return false;}if (currentTime == 0) {if (stringBuilder.length() > 0) {stringBuilder = stringBuilder.delete(0, stringBuilder.length());}currentTime = System.currentTimeMillis();} else {if ((System.currentTimeMillis() - currentTime) > maxKeysInterval) {if (stringBuilder.length() > 0) {stringBuilder = stringBuilder.delete(0,stringBuilder.length());}}currentTime = System.currentTimeMillis();}// Shiftif (keyCode == KeyEvent.KEYCODE_SHIFT_RIGHT || keyCode == KeyEvent.KEYCODE_SHIFT_LEFT) {if (event.getAction() == KeyEvent.ACTION_DOWN) {//按着shift键,表示大写isKeySHIFT = true;} else {//松开shift键,表示小写isKeySHIFT = false;}}// Enterif (keyCode == KeyEvent.KEYCODE_ENTER) {isKeySHIFT = false;currentTime = 0;if (callBack != null) {log.info("stringBuilder:" + stringBuilder);callBack.onScanFinish(stringBuilder.toString());}return true;}if (keyCode >= KeyEvent.KEYCODE_0 && keyCode <= KeyEvent.KEYCODE_9) {// 数字键(键盘上方横条数字,需要考虑Shift)handleTopNumKeys(keyCode);} else if (keyCode >= 29 && keyCode <= 54) {// 字母键(需要考虑Shift)wwcheckShift((char) (keyCode + 68), (char) (keyCode + 36));} else if (keyCode >= 144 && keyCode <= 158) {// 数字键盘区handleNumPadKeys(keyCode);log.info("数字:" + stringBuilder);} else {// 键盘主键区其他双字符键位switch (keyCode) {case KeyEvent.KEYCODE_GRAVE: {checkShift(ASCII.CHAR_SIGN_BACKTICK, ASCII.CHAR_SIGN_TILDE);break;}case KeyEvent.KEYCODE_MINUS: {checkShift(ASCII.CHAR_SIGN_MINUS, ASCII.CHAR_SIGN_UNDERSCORE);break;}case KeyEvent.KEYCODE_EQUALS: {checkShift(ASCII.CHAR_SIGN_EQUALS, ASCII.CHAR_SIGN_PLUS);break;}case KeyEvent.KEYCODE_LEFT_BRACKET: {checkShift(ASCII.CHAR_SIGN_BRACKET_LEFT,ASCII.CHAR_SIGN_BRACE_LEFT);break;}case KeyEvent.KEYCODE_RIGHT_BRACKET: {checkShift(ASCII.CHAR_SIGN_BRACKET_RIGHT,ASCII.CHAR_SIGN_BRACE_RIGHT);break;}case KeyEvent.KEYCODE_BACKSLASH: {checkShift(ASCII.CHAR_SIGN_BACKSLASH, ASCII.CHAR_SIGN_BAR);break;}case KeyEvent.KEYCODE_SEMICOLON: {checkShift(ASCII.CHAR_SIGN_SEMICOLON, ASCII.CHAR_SIGN_COLON);break;}case KeyEvent.KEYCODE_APOSTROPHE: {checkShift(ASCII.CHAR_SIGN_QUOTE, ASCII.CHAR_SIGN_DOUBLE_QUOTE);break;}case KeyEvent.KEYCODE_COMMA: {checkShift(ASCII.CHAR_SIGN_COMMA, ASCII.CHAR_SIGN_LESS);break;}case KeyEvent.KEYCODE_PERIOD: {checkShift(ASCII.CHAR_SIGN_PERIOD, ASCII.CHAR_SIGN_GREATER);break;}case KeyEvent.KEYCODE_SLASH: {checkShift(ASCII.CHAR_SIGN_SLASH, ASCII.CHAR_SIGN_QUESTION);break;}// 其他单字符键位case KeyEvent.KEYCODE_SPACE: {stringBuilder.append(ASCII.CHAR_SIGN_SPACE);log.info("Other StringBuilder:" + stringBuilder);break;}default: {return false;}}return true;}return true;}/*** 判断是否同时按下Shift键** @param ascallNoShift* @param ascallOnShift*/private void checkShift(char ascallNoShift, char ascallOnShift) {if (isKeySHIFT) {stringBuilder.append(ascallOnShift);isKeySHIFT = false;} else {stringBuilder.append(ascallNoShift);}}/*** 数字键盘区按键** @param keyCode*/public void handleNumPadKeys(int keyCode) {if (keyCode <= 153) {stringBuilder.append((char) (keyCode - 96));} else if (keyCode == KeyEvent.KEYCODE_NUMPAD_DIVIDE) {stringBuilder.append(ASCII.CHAR_SIGN_SLASH);} else if (keyCode == KeyEvent.KEYCODE_NUMPAD_MULTIPLY) {stringBuilder.append(ASCII.CHAR_SIGN_STAR);} else if (keyCode == KeyEvent.KEYCODE_NUMPAD_SUBTRACT) {stringBuilder.append(ASCII.CHAR_SIGN_MINUS);} else if (keyCode == KeyEvent.KEYCODE_NUMPAD_ADD) {stringBuilder.append(ASCII.CHAR_SIGN_PLUS);} else if (keyCode == KeyEvent.KEYCODE_NUMPAD_DOT) {stringBuilder.append(ASCII.CHAR_SIGN_PERIOD);}}/*** 键盘上方数字键** @param keyCode*/private void handleTopNumKeys(int keyCode) {if (keyCode < 7 || keyCode > 16) {return;}switch (keyCode) {case KeyEvent.KEYCODE_0:checkShift(ASCII.CHAR_NUM_0, ASCII.CHAR_SIGN_PAREN_RIGHT);break;case KeyEvent.KEYCODE_1:checkShift(ASCII.CHAR_NUM_1, ASCII.CHAR_SIGN_EXCLAM);break;case KeyEvent.KEYCODE_2:checkShift(ASCII.CHAR_NUM_2, ASCII.CHAR_SIGN_AT);break;case KeyEvent.KEYCODE_3:checkShift(ASCII.CHAR_NUM_3, ASCII.CHAR_SIGN_HASH);break;case KeyEvent.KEYCODE_4:checkShift(ASCII.CHAR_NUM_4, ASCII.CHAR_SIGN_DOLLAR);break;case KeyEvent.KEYCODE_5:checkShift(ASCII.CHAR_NUM_5, ASCII.CHAR_SIGN_PERCENT);break;case KeyEvent.KEYCODE_6:checkShift(ASCII.CHAR_NUM_6, ASCII.CHAR_SIGN_CARET);break;case KeyEvent.KEYCODE_7:checkShift(ASCII.CHAR_NUM_7, ASCII.CHAR_SIGN_AMPERSAND);break;case KeyEvent.KEYCODE_8:checkShift(ASCII.CHAR_NUM_8, ASCII.CHAR_SIGN_STAR);break;case KeyEvent.KEYCODE_9:checkShift(ASCII.CHAR_NUM_9, ASCII.CHAR_SIGN_PAREN_LEFT);break;default:break;}}public interface ScanGunCallBack {public void onScanFinish(String data);}
}

3、在Fragment中使用ScanGun类。

ScanGun类定义了一个内部类接口,data就是扫描完成后的内容:

public interface ScanGunCallBack {public void onScanFinish(String data);
}

扫码完成后,调用该接口的onScanFinish方法:

// Enter
if (keyCode == KeyEvent.KEYCODE_ENTER) {isKeySHIFT = false;currentTime = 0;if (callBack != null) {log.info("stringBuilder:" + stringBuilder);callBack.onScanFinish(stringBuilder.toString());}return true;
}

所以在Fragment获取扫描结果,需要创建Scan的实例,并且实现这个onScanFinish方法:

/* 初始化扫码枪 */
private void initScanGun() {// 设置key事件最大间隔,默认20ms,部分低端扫码枪效率低ScanGun.setMaxKeysInterval(50);scanGun = new ScanGun(new ScanGun.ScanGunCallBack() {@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR1)@Overridepublic void onScanFinish(String scanResult) {if (payment.getVisibility() != View.GONE) { // 支付页面没关闭loadingDailog = createWaitingUI(loadingDailog, LOADING_MSG_Paying);// 判断优惠券是否可用if (!validateCouponCodeAvailable()) {return;}if (choosePaymentType.getCheckedRadioButtonId() == wechatPay.getId()) {……

安卓开发实现获取扫码枪扫码二维码、条形码后的内容相关推荐

  1. 使用扫码枪扫码二维码并采集二维码信息

    思路 一.购买可以扫码二维码的扫码枪(我这里采购的是 scanhome 高密版)也可以采购其他的扫码枪.扫码枪的原理其实就是识别二维码信息 然后 替代人工键盘输入将信息输入到 光标所在的输入框或者文件 ...

  2. 视频教程-微信公众平台深度开发v2.0第3季——二维码、模板消息-微信开发

    微信公众平台深度开发v2.0第3季--二维码.模板消息 微信企业号星级会员.10多年软件从业经历,国家级软件项目负责人,主要从事软件研发.软件企业员工技能培训.已经取得计算机技术与软件资格考试(软考) ...

  3. uni-app微信小程序扫普通二维码分享小程序

    这里需要扫普通二维码分享的话就需要先产生二维码了 文档:https://github.com/yingye/weapp-qrcode 1.绘制二维码 我这里使用的是资源是weapp.qrcode.es ...

  4. 微信小程序扫普通二维码跳转

    最近一需求,是要做小程序扫普通二维码跳转.看了看微信文档一头雾水,写的不是很清楚. 官方文档传送门:https://developers.weixin.qq.com/miniprogram/intro ...

  5. 扫普通二维码进入小程序、链接进入小程序

    目录 一.扫普通二维码进入小程序 1.扫码进入小程序管理页 2.点击开发管理-开发设置-扫普通链接二维码打开小程序-添加 3. 完善配置内容 二. 前端获取参数 三.开发本地调试 一.扫普通二维码进入 ...

  6. 微信扫一扫扫描二维码跳转到小程序指定页面

    转载:微信扫一扫扫描二维码跳转到小程序指定页面 1微信公众平台-开发-开发设置-扫普通链接二维码打开小程序 2点击添加 3设置二维码规则,选择测试范围 4 保存后,可根据测试连接生成二维码,通过微信扫 ...

  7. 用STM32实现:摄像头扫到二维码后提取二维码中的信息分别放到数组中

    摄像头扫到二维码后提取二维码中的信息分别放到数组中 把想要的信息编辑好放到二维码中(网上有好多在线生成二维码的工具) /** *作者:魏波 *时间:2017.6.6 * **/char name[6] ...

  8. STM32F407获取OV7670摄像头图像及上位机解码(一维码二维码)

    STM32F407获取OV7670摄像头图像及上位机解码(一维码&二维码) 1. 目的 针对静止拍摄图像场景,实现STM32F407对30万像素OV7670摄像头进行图像捕获,并通过串口将数据 ...

  9. IOS 调用微信扫码二维码

    一.微信已发展成一个庞大的生态系统,是生活.社交不可缺少的优秀产品.ios 开发中时常需要调用相关微信功能,扫码二维码等 1.info.plist 添加白名单 ***LSApplicationQuer ...

最新文章

  1. matlab plot不均匀间隔,matplotlib如何绘制间隔为2^n的不均匀图形?
  2. wikioi 1083 Cantor表
  3. 华为路由器ospf路由表解读_华为动态路由OSPF实例详解之多区域配置-华为路由器设置...
  4. Linux内核网络设备驱动
  5. 【AC自动机】屏蔽词删除(ybtoj AC自动机-4)
  6. 使IE6下PNG背景图片透明的七种方法
  7. 前端笔记-vue cli中使用router-link进行路由跳转
  8. flink CompactingHashTable源码解析
  9. HTML在日期单元格添加小图片,如何给图片添加上文字、日期和自己名字的小水印呢?...
  10. 7收不到邮件 contact form_Contact Form 7基本使用教程
  11. SAP License:按BOM进行原料耗用拆分-模拟面包制造
  12. 游戏筑基开发之C语言回调函数使用实例及其.h库封装实例
  13. HTML hidden 属性
  14. 在 MAC下安装 Exuberant ctags
  15. 张高兴的 Windows 10 IoT 开发笔记:部署 ASP.NET Core 2 应用
  16. 17-[案例1]奇虎导航案例
  17. 基于51单片机的电子钟万年历LCD1602显示
  18. 分布式机器学习的集群方案介绍之HPC实现
  19. 我们不再沉默 给入侵黑客一个“下马威”
  20. 元祖python_Python ---元祖

热门文章

  1. 触动传媒总部人去楼空 上海多家出租车公司追讨欠款
  2. 提升Python性能,媲美C语言
  3. iOS之常用第三方库的介绍
  4. phpmyadin安装配置
  5. 腾讯马化腾:未来是全真互联网
  6. 英语句子成分分析(二)--十大词类
  7. 宝石塔防:如果还有人过不去1337,俺来发个详细点儿的攻略吧
  8. 公众号代运营与自运营相比,优势体现在哪些方面?
  9. 运营好公众号需要具备的能力/技能
  10. x509证书OpenSSL 数据结构