需求

普通的手机开发,可以做一个二维码扫码的页面,用zxing一类的可以轻松实现,但是,如果是大型的安卓系统的终端机的话,摄像头不方便使用。可以依靠扫码枪来实现类似的效果。

分析

大型安卓设备与安卓手机的开发区别还是比较大的,尤其是扫码枪部分,有以下特点。例如:

  • 终端机的开发中,经常是Activity 数量比较少,Fragment比较多。
  • 扫码枪需要全局响应。并不只局限于某一个Fragment。
  • 大多数扫码枪的原理是模拟键盘进行输入,所以不支持包含有汉字的二维码

我这边使用是USB HID的扫码枪,即插即用,只需要在界面上有带有焦点的EditText ,就可以获取扫码枪扫描的内容。大多数扫码枪是模拟键盘进行输入,大多数时候需要使用获取焦点的 EditText 接收其扫描的信息。
显然这并不能满足我们的需求。那么,仔细想一下,我们可以认为是在短时间内,识别了二维码中的非汉字信息,并依次按键。我们可以在按键的时候进行按键事件 onKeyDown 的拦截。等全部扫描完毕之后,再去执行其它操作。

USB HID扫码枪会将扫描出来的内容转化为键盘事件,对应的就是Android中的KeyEvent事件,所以我们只需要在我们的activity中重写onKeyDown方法,即可获取相应事件。

实现

找规律

既然我们要进行按键事件拦截,那么就得有一个明确的拦截开始时间和结束时间。可以先通过打印所有的keycode,来观察扫码后都执行了哪些按键。
例如我的扫码枪,在真正内容开始前和结束后,会按下一个keycode 值为 143 的按键。即 KEYCODE_NUM_LOCK 小键盘锁 。
那么可以设置一个布尔值,标识当前是否是扫描状态。并在结束的时候进行下一步操作。即:

怎么进行下一步操作?方法太多了,EventBus,接口回调,方法,……

  var isScan = false;  // 当前是否是扫描状态···if (keyCode == KeyEvent.KEYCODE_NUM_LOCK) {if (isScan) {LogUtils.e("String ==>" + ScanString)ScanString = ""} else {LogUtils.e("String ==>" + "开始扫描……")}isScan = !isScanreturn true;}if (isScan) {ScanString += getInputCode(event).toString()return true;}

拼接字符串

只获取到了 keycode 值不行,还需要将keycode值转为具体的内容。

    //获取扫描内容private fun getInputCode(event: KeyEvent): Char {val keyCode = event.keyCodeval aChar: Charif (keyCode >= KeyEvent.KEYCODE_A && keyCode <= KeyEvent.KEYCODE_Z) {//字母aChar = (('a').toInt() + keyCode - KeyEvent.KEYCODE_A).toChar()} else if (keyCode >= KeyEvent.KEYCODE_0 && keyCode <= KeyEvent.KEYCODE_9) {//数字aChar = ('0' + keyCode - KeyEvent.KEYCODE_0).toChar()} else if (keyCode == KeyEvent.KEYCODE_ENTER) {aChar = 0.toChar()} else {//其他符号aChar = event.unicodeChar.toChar()}return aChar}

代码

    var isScan = false;  // 当前是否是扫描状态var ScanString = "";  // 扫描出的内容override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean {if (keyCode == KeyEvent.KEYCODE_NUM_LOCK) {if (isScan) {LogUtils.e("String ==>" + ScanString)ScanString = ""} else {LogUtils.e("String ==>" + "开始扫描……")}isScan = !isScanreturn true;}if (isScan) {ScanString += getInputCode(event).toString()return true;}return super.onKeyDown(keyCode, event)}//获取扫描内容private fun getInputCode(event: KeyEvent): Char {val keyCode = event.keyCodeval aChar: Charif (keyCode >= KeyEvent.KEYCODE_A && keyCode <= KeyEvent.KEYCODE_Z) {//字母aChar = (('a').toInt() + keyCode - KeyEvent.KEYCODE_A).toChar()} else if (keyCode >= KeyEvent.KEYCODE_0 && keyCode <= KeyEvent.KEYCODE_9) {//数字aChar = ('0' + keyCode - KeyEvent.KEYCODE_0).toChar()} else if (keyCode == KeyEvent.KEYCODE_ENTER) {aChar = 0.toChar()} else {//其他符号aChar = event.unicodeChar.toChar()}return aChar}

安卓keycode列表

详细列表 见 https://blog.csdn.net/feizhixuan46789/article/details/16801429
此处简单总结一下keycode列表。

  • 0-9 对应的是 KEYCODE_0 - KEYCODE_9,真实的值为 7 - 16
  • A-Z 对应的是 KEYCODE_A - KEYCODE_Z ,值为 29 - 54
  • 上下左右中 对应 19-23,
  • 功能键如下:
    KEYCODE_ENTER 回车键 66
    KEYCODE_ESCAPE ESC键 111
    KEYCODE_DPAD_CENTER 导航键 确定键 23
    KEYCODE_DPAD_UP 导航键 向上 19
    KEYCODE_DPAD_DOWN 导航键 向下 20
    KEYCODE_DPAD_LEFT 导航键 向左 21
    KEYCODE_DPAD_RIGHT 导航键 向右 22
    KEYCODE_MOVE_HOME 光标移动到开始键 122
    KEYCODE_MOVE_END 光标移动到末尾键 123
    KEYCODE_PAGE_UP 向上翻页键 92
    KEYCODE_PAGE_DOWN 向下翻页键 93
    KEYCODE_DEL 退格键 67
    KEYCODE_FORWARD_DEL 删除键 112
    KEYCODE_INSERT 插入键 124
    KEYCODE_TAB Tab键 61
    KEYCODE_NUM_LOCK 小键盘锁 143
    KEYCODE_CAPS_LOCK 大写锁定键 115
    KEYCODE_BREAK Break/Pause键 121
    KEYCODE_SCROLL_LOCK 滚动锁定键 116
    KEYCODE_ZOOM_IN 放大键 168
    KEYCODE_ZOOM_OUT 缩小键 169

安卓扫码枪开发,拦截扫码事件相关推荐

  1. 关于微信公众号开发中扫码关注和关注之后继续扫码的不同点

    2019独角兽企业重金招聘Python工程师标准>>> 开发微信商城,当遇到需要绑定上下级关系的时候,会通过扫码的方式关注公众号,但是如果不想做这个人的下级,后台添加解绑功能,继续扫 ...

  2. 扫码枪多次扫码用空格分开

    扫码枪多次扫码用空格分开 // 监听输入框值,清空累加值changeThing (val) {let _this = thisif (!(val)) {_this.oldValue = ''_this ...

  3. 怎么开发支付宝扫码收款应用-java 支付宝当面付

    怎么开发支付宝扫码收款应用 说来也是很惭愧,之前计划好了每周写2~3篇的博客来记录,但是因为工作一忙(就是懒!)根本就没有时间来完成计划所以很久没有写了,希望之后可以每周一篇博客把,这篇主要就是记录一 ...

  4. wechat-0050,微信公众号,带参数的二维码获取与扫码事件推送

    demo:https://github.com/wenrongyao/wechat-demo 摘要:这篇帖子讲述如何获取带参数的二维码,以及扫码带参数的二维码后的事件接收. 微信开发者文档:https ...

  5. 微信开发之扫码开票解决方案

    微信开发之扫码开票提供两种解决方案 微信公众号方案 通过扫码获取二维码中的参数,然后通过微信自建平台扫码,设置参数,获取授权页面,申请开票,调用中间开票系统进行开票,然后插入微信卡包,支持在线预览,支 ...

  6. 微信公众号开发之扫码支付

    此项目已开源欢迎Start.PR.发起Issues一起讨论交流共同进步 https://github.com/Javen205/IJPay http://git.oschina.net/javen20 ...

  7. IM即时通讯软件开发之扫码登录功能

    在2维码扫码登录的过程中,大家可能会有疑问:这二维码安全吗?会不会泄漏我的个人信息?我的im系统敢不敢也搞一个扫码登录呢? 针对这些顾虑,我们需要了解一下二维码扫码登录背后的技术和逻辑本质. 扫码登录 ...

  8. 浅析IM即时通讯开发之扫码登录二维码

    二维码技术使用起来很简单,本系列的前三篇文章也专门针对IM扫码登录这个功能做了详细的分享,但本着学习技术不留死角的习惯,我认为有必要单独学习一下到底什么是二维码(说不定哪天被个刚入行的程序员轻轻一句& ...

  9. 微信支付开发(2) 扫码支付模式一

    关键字:微信支付 微信支付v3 native支付 扫码支付模式一 统一支付 Native支付 prepay_id  作者:方倍工作室 原文: http://www.cnblogs.com/txw195 ...

  10. JS_微信公众号开发调用扫码支付功能

    需要在公众号里面切入扫码功能 前端代码: <!DOCTYPE html> <html> <head lang="en"><meta cha ...

最新文章

  1. 网络管理员&MCSE2003之5:第1章 帐户和资源管理
  2. 在虚拟机安装OpenSuse Tumbleweed
  3. 实心等腰直角三角形。
  4. .NET实时2D渲染入门·动态时钟
  5. 大厂十年:我的三段职业经历和八条建议!
  6. Android编译tcpdump,android 使用tcpdump
  7. python安装环境配置
  8. Atitit freemarker模板总结 D:\workspace\springboothelloword\src\com\attilax\util\TempleteFreemarkerUtil.
  9. matlab 文本分析工具,MATLAB,Simulink. - Text Analytics , 文本分析工具箱-鈦思科技
  10. linux虚拟机简单部署以及安装可视化界面
  11. cad字体安装_CAD字体如何设置使用?1分钟教会你!附送2800多款CAD字体
  12. ROS入门之创建节点
  13. 计算机推免资源(不定期更新)
  14. item_search_img - 按图搜索1688商品(拍立淘)
  15. 用UCWEB浏览器上网 省流量小技巧
  16. 电商平台数据仓库搭建01-项目介绍
  17. 用FileExplorer查看android手机中的数据库
  18. 使用谷歌浏览器调试PC网页、手机APP
  19. eplan 电箱布局_Eplan3D布局步骤解密
  20. 使用HTML实现网页滚动图片

热门文章

  1. R语言也能玩ps?magick包你值得拥有
  2. 将win10输入法设置为默认美式键盘且用shift+ctrl切换
  3. 服装尺寸 html,服装尺寸S、M、L、XL、XXL分别表示的型号大小和释义(完整版)...
  4. 优酷KUX视频转换MP4工具,纯个人向分享
  5. 网上下载图片去水印的方法
  6. 使用python爬虫增加浏览量
  7. c语言编译运行的几步
  8. java 加权平均_加权平均值 - 不羁之后的个人空间 - OSCHINA - 中文开源技术交流社区...
  9. EXCEL功能之Excel表格边框设置
  10. 5-1MongoDB 实验——数据备份和恢复--edu上面的nosql题目