安卓扫码枪开发,拦截扫码事件
需求
普通的手机开发,可以做一个二维码扫码的页面,用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
安卓扫码枪开发,拦截扫码事件相关推荐
- 关于微信公众号开发中扫码关注和关注之后继续扫码的不同点
2019独角兽企业重金招聘Python工程师标准>>> 开发微信商城,当遇到需要绑定上下级关系的时候,会通过扫码的方式关注公众号,但是如果不想做这个人的下级,后台添加解绑功能,继续扫 ...
- 扫码枪多次扫码用空格分开
扫码枪多次扫码用空格分开 // 监听输入框值,清空累加值changeThing (val) {let _this = thisif (!(val)) {_this.oldValue = ''_this ...
- 怎么开发支付宝扫码收款应用-java 支付宝当面付
怎么开发支付宝扫码收款应用 说来也是很惭愧,之前计划好了每周写2~3篇的博客来记录,但是因为工作一忙(就是懒!)根本就没有时间来完成计划所以很久没有写了,希望之后可以每周一篇博客把,这篇主要就是记录一 ...
- wechat-0050,微信公众号,带参数的二维码获取与扫码事件推送
demo:https://github.com/wenrongyao/wechat-demo 摘要:这篇帖子讲述如何获取带参数的二维码,以及扫码带参数的二维码后的事件接收. 微信开发者文档:https ...
- 微信开发之扫码开票解决方案
微信开发之扫码开票提供两种解决方案 微信公众号方案 通过扫码获取二维码中的参数,然后通过微信自建平台扫码,设置参数,获取授权页面,申请开票,调用中间开票系统进行开票,然后插入微信卡包,支持在线预览,支 ...
- 微信公众号开发之扫码支付
此项目已开源欢迎Start.PR.发起Issues一起讨论交流共同进步 https://github.com/Javen205/IJPay http://git.oschina.net/javen20 ...
- IM即时通讯软件开发之扫码登录功能
在2维码扫码登录的过程中,大家可能会有疑问:这二维码安全吗?会不会泄漏我的个人信息?我的im系统敢不敢也搞一个扫码登录呢? 针对这些顾虑,我们需要了解一下二维码扫码登录背后的技术和逻辑本质. 扫码登录 ...
- 浅析IM即时通讯开发之扫码登录二维码
二维码技术使用起来很简单,本系列的前三篇文章也专门针对IM扫码登录这个功能做了详细的分享,但本着学习技术不留死角的习惯,我认为有必要单独学习一下到底什么是二维码(说不定哪天被个刚入行的程序员轻轻一句& ...
- 微信支付开发(2) 扫码支付模式一
关键字:微信支付 微信支付v3 native支付 扫码支付模式一 统一支付 Native支付 prepay_id 作者:方倍工作室 原文: http://www.cnblogs.com/txw195 ...
- JS_微信公众号开发调用扫码支付功能
需要在公众号里面切入扫码功能 前端代码: <!DOCTYPE html> <html> <head lang="en"><meta cha ...
最新文章
- 网络管理员&MCSE2003之5:第1章 帐户和资源管理
- 在虚拟机安装OpenSuse Tumbleweed
- 实心等腰直角三角形。
- .NET实时2D渲染入门·动态时钟
- 大厂十年:我的三段职业经历和八条建议!
- Android编译tcpdump,android 使用tcpdump
- python安装环境配置
- Atitit freemarker模板总结 D:\workspace\springboothelloword\src\com\attilax\util\TempleteFreemarkerUtil.
- matlab 文本分析工具,MATLAB,Simulink. - Text Analytics , 文本分析工具箱-鈦思科技
- linux虚拟机简单部署以及安装可视化界面
- cad字体安装_CAD字体如何设置使用?1分钟教会你!附送2800多款CAD字体
- ROS入门之创建节点
- 计算机推免资源(不定期更新)
- item_search_img - 按图搜索1688商品(拍立淘)
- 用UCWEB浏览器上网 省流量小技巧
- 电商平台数据仓库搭建01-项目介绍
- 用FileExplorer查看android手机中的数据库
- 使用谷歌浏览器调试PC网页、手机APP
- eplan 电箱布局_Eplan3D布局步骤解密
- 使用HTML实现网页滚动图片
热门文章
- R语言也能玩ps?magick包你值得拥有
- 将win10输入法设置为默认美式键盘且用shift+ctrl切换
- 服装尺寸 html,服装尺寸S、M、L、XL、XXL分别表示的型号大小和释义(完整版)...
- 优酷KUX视频转换MP4工具,纯个人向分享
- 网上下载图片去水印的方法
- 使用python爬虫增加浏览量
- c语言编译运行的几步
- java 加权平均_加权平均值 - 不羁之后的个人空间 - OSCHINA - 中文开源技术交流社区...
- EXCEL功能之Excel表格边框设置
- 5-1MongoDB 实验——数据备份和恢复--edu上面的nosql题目