Android 扫码枪 读取(外接键盘读取)

1、概述

android 设备外接一个 标准扫码枪,要把扫码枪扫到的内容取出来。界面上放一个EditTextView 直接就把内容显示到EditTextView中了。 然而有些界面上并不能摆EditTextView 。针对没有EditTextView的界面展开下文。扫码枪和外接键盘原理是一样的,类比,也特意拿了个外接键盘一起调研了。

2、扫码枪-输入设备

项目中使用的是标准的扫码枪(实验的是新大陆的NLS-FR40),标准的意思就是它都不给开发文档。查了下说是走的标准“输入事件”,和外接键盘是一样的。既然是输入事件,就掐Activity 的 dispatchKeyEvent 方法了。

public boolean dispatchKeyEvent(KeyEvent event) {

扫码枪在识别到扫的码后,会多一个KEYCODE_ENTER,和KEYCODE_DPAD_DOWN 事件,查阅的资料里都有说到KEYCODE_ENTER,没提到KEYCODE_DPAD_DOWN,也不知道其它扫码枪会不会生成这个事件

3、实验结果

在Activity 的dispatchKeyEvent 方法中把 KeyEvent log 打印了下:(只打出action=ACTION_UP 躺起的log,按下action=ACTION_DOWN 是结队的 忽略)

3.1、android 设备软键盘的log

3.2、外接扫码枪的log (新大陆的NLS-FR40)

3.2、外接键盘的log (普通的键盘)

这里附一句,若小键盘的num按钮锁住,metaState= meta_num_lock_on

对比结论小结:

标准外接扫描枪和标准外接键盘是类似的输入设备

自带软件盘的输入事件里,deviceId,source,scanCode,flag 和外接的设备不同

扫码枪和外接键盘的 deviceId,source 不同

4、查看KeyEvent源码进行比较

简单的查看下keyEvent 的源码,可以明显的看到,设备的虚拟软键盘是把deiveId=KeyCharacterMap.VIRTUAL_KEYBOARD (-1),写死了,所以取该字段的不同来区分是软键盘还是 外接键盘。 目前不打算区分扫描枪和外接键盘。

* Create a new key event.

*

* @param downTime The time (in {@link android.os.SystemClock#uptimeMillis})

* at which this key code originally went down.

* @param eventTime The time (in {@link android.os.SystemClock#uptimeMillis})

* at which this event happened.

* @param action Action code: either {@link #ACTION_DOWN},

* {@link #ACTION_UP}, or {@link #ACTION_MULTIPLE}.

* @param code The key code.

* @param repeat A repeat count for down events (> 0 if this is after the

* initial down) or event count for multiple events.

*/

public KeyEvent(long downTime, long eventTime, int action,

int code, int repeat) {

mDownTime = downTime;

mEventTime = eventTime;

mAction = action;

mKeyCode = code;

mRepeatCount = repeat;

mDeviceId = KeyCharacterMap.VIRTUAL_KEYBOARD;

}

/**

* Create a new key event.

*

* @param downTime The time (in {@link android.os.SystemClock#uptimeMillis})

* at which this key code originally went down.

* @param eventTime The time (in {@link android.os.SystemClock#uptimeMillis})

* at which this event happened.

* @param action Action code: either {@link #ACTION_DOWN},

* {@link #ACTION_UP}, or {@link #ACTION_MULTIPLE}.

* @param code The key code.

* @param repeat A repeat count for down events (> 0 if this is after the

* initial down) or event count for multiple events.

* @param metaState Flags indicating which meta keys are currently pressed.

* @param deviceId The device ID that generated the key event.

* @param scancode Raw device scan code of the event.

*/

public KeyEvent(long downTime, long eventTime, int action,

int code, int repeat, int metaState,

int deviceId, int scancode) {

mDownTime = downTime;

mEventTime = eventTime;

mAction = action;

mKeyCode = code;

mRepeatCount = repeat;

mMetaState = metaState;

mDeviceId = deviceId;

mScanCode = scancode;

}

5、拦截策略

需要一点android “事件传递” 的基础知识,面试必备知识。以前也记录过:Android 事件传递与焦点处理(tv)

在Activity 中事件传递,特别是按键的拦截其实很方便,重写dispatchKeyEvent 方法就可以了。重写的思路也很简单:判断是不是扫描枪用deviceId == -1 来判断。

伪代码

public boolean dispatchKeyEvent(KeyEvent event) {

Log.d(TAG, "event= " + event);

if (如果是扫描枪的事件) {

//直接消费掉,不继续向下传,editTextView也不自动填充了,KEYCODE_ENTER 事件也不影响 其它控件了,比如button 的点击事件

return true;

}

return super.dispatchKeyEvent(event);

}

实际使用中,往往没有这么暴力,比如要对是否完全拦截进行控制,单独封装管理工具类,这些属于封装技巧了,在章末有简单封装

* 处理输入事件

*

* @param event

* @return true 表示消费掉,拦截不在传递, false 不管

*/

public boolean dispatchKeyEvent(KeyEvent event) {

/**

* 系统的软键盘 按下去是 -1, 不管,不拦截

*/

if (event.getDeviceId() == -1) {

return false;

}

//按下弹起,识别到弹起的话算一次 有效输入

//只要是 扫码枪的事件 都要把他消费掉 不然会被editText 显示出来

if (event.getAction() == KeyEvent.ACTION_UP) {

//只要数字,一维码里面没有 字母

int code = event.getKeyCode();

if (code >= KeyEvent.KEYCODE_0 && code <= KeyEvent.KEYCODE_9) {

codeStr += (code - KeyEvent.KEYCODE_0);

}

//识别到结束,当下使用的设备是 是还会有个KEYCODE_DPAD_DOWN 事件,不知道其它设备有没有 先忽略

if (code == KeyEvent.KEYCODE_ENTER) {

if (listener != null) {

listener.onResult(codeStr);

codeStr = "";

}

}

}

//都是扫码枪来的事件,选择消费掉

return isInterrupt;

}

6、其它处理

项目需要外接扫码枪,扫码枪有几种模式:

短按触发扫码,松开停止

短按触发,连续扫码

感应触发,超时停止 (项目中会用这种方式)

描述这个的原因是,会涉及不相关界面的误操作,比如在x界面,我们去扫码了。如果不处理会导致KEYCODE_ENTER 会响应该界面中的某个按钮点击事件,造成干扰。so 我们需要在这个项目的基类BaseActivity 中对扫码枪的输入事件进行处理。目前我打算使用的处理策略是,BaseActivity 完全拦截扫码枪事件,需要使用到的界面自行打开。这边的处理算封装上的处理就不熬述了,具体见demo代码

7、付例与参考

注:

AccessibilityService 的方式,需要手动在:设置->无障碍->服务,中开启,需要人力培训交互不够友好放弃了

参考:

工程demo

android页面监听扫描枪,GitHub - rorine/BarcodeScannerGunMaster: android 扫码枪 内容读取,与拦截editText消费...相关推荐

  1. php 监听 扫描枪,jquery监听扫码枪获得值

    客户一直说 扫码枪要一直获得焦点才能用,用户体验差 ,想做一个 在这个页面 有没有焦点都要获得到值,想了一下 只有用监听的方式了 // 写一个监听扫描枪 事件的方法 var code = ''; va ...

  2. 监听pda扫描_Android监听扫描枪内容(一)

    在之前的文章,我已经写过了一篇关于扫描枪数据获取通常处理的文章,大家有兴趣的话可以参看 PDA扫描获取内容的通常处理 但此方式在实际运用中,有一个不方便的地方,那就是要想监听扫描枪的内容,我们必须在布 ...

  3. Android页面监听虚拟键盘弹出、收起

    js 移动端关于页面布局,如果底部有 position: fixed 的盒子, 又有input,当软键盘弹出收起都会影响页面布局. 如图: 页面这时候Android可以监听resize事件,代码如下, ...

  4. js 监听扫描枪输入事件

    扫码枪本质上来讲是一种输入设备,和键盘没有任何区别,因此如何实现对扫码枪的判断是一个难点. 另外一个难点在于如何在不使用文本框监听的情况下实现对扫码枪的监听与输入. 关于以上两点,首先,可以通过判断输 ...

  5. 监听pda扫描_html5+的plus 监听扫描枪广播 处理扫描结果

    //监听广播 function scanEvent() { var main = plus.android.runtimeMainActivity();//获取activity var context ...

  6. php 监听条码枪输入,使用jQuery监听扫码枪输入并禁止手动输入的实现方法

    @(知识点总结)[jquery|扫码抢] 基于jQuery的扫码枪监听.如果只是想实现监听获取条码扫码信息,可以直接拿来使用,如果有更多的条码判断处理逻辑需要自己扩展. 一.功能需求 使用扫码枪扫描条 ...

  7. Android 设备蓝牙连接扫描枪获取扫描内容

    Android 设备蓝牙连接扫描枪获取扫描内容 标签(空格分隔): 未分类 条形扫描枪主要可以扫描条形码和二维码等,扫描速度比手机扫描设备快得多,本文简单介绍android 通过蓝牙监听蓝牙连接,当扫 ...

  8. php 监听条码枪输入,运用jQuery监听扫码枪输入并制止手动输入的完成要领

    基于jQuery的扫码枪监听.假如只是想完成监听猎取条码扫码信息,能够直接拿来运用,假如有更多的条码推断处置惩罚逻辑须要本身扩大. 一.功用需求 运用扫码枪扫描条码,在一个web页面监听猎取扫码枪的数 ...

  9. php 监听条码枪输入,使用jQuery监听扫码枪输入并禁止手动输入的实现方法(推荐)...

    基于jQuery的扫码枪监听.如果只是想实现监听获取条码扫码信息,可以直接拿来使用,如果有更多的条码判断处理逻辑需要自己扩展. 一.功能需求 使用扫码枪扫描条码,在一个web页面监听获取扫码枪的数据, ...

  10. php 监听条码枪输入,jQuery监听扫码枪禁止手动输入的实现方法

    本文主要和大家 分享基于jQuery的扫码枪监听.如果只是想实现监听获取条码扫码信息,可以直接拿来使用,如果有更多的条码判断处理逻辑需要自己扩展哦,希望能帮助到大家. 一.功能需求 使用扫码枪扫描条码 ...

最新文章

  1. MySQL Proxy实现数据库读写分离
  2. 皮一皮:男女的不同...
  3. mysql数据类型不写(),MYSQL 数据类型
  4. kohana中的路由规则
  5. Python中Pyaudio安装失败的解决办法
  6. 在Eclipse中高效运行HTTP / REST集成测试
  7. 软件测试行业用mac好还是win好,业余RMAA测试 同样的硬件下OS X果然比Windows声音好...
  8. Java中的接口与抽象类的区别
  9. YonBIP—助力企业数字化转型之道
  10. keil51免费版安装教程2032版本
  11. 常用计算机应用软件,电脑必备哪些应用软件?
  12. 肿瘤信息学中一些专业词汇整理(不断更新ing)
  13. 以图搜图 图像匹配_以图搜图是什么 如何实现以图搜图
  14. panic: reflect: reflect.Value.SetString using value obtained using unexported field
  15. xavier / acts-as-tree-with-dotted-ids
  16. curl证书过期_定时检测SSL证书过期情况并发送通知
  17. Xmind教程:思维导图原来这么简单实用!
  18. 【English】二、It作为代词,可以代指什么
  19. 世界计算机科学大会,【计算机视觉】世界三大顶级会议介绍
  20. switchyomega插件自动切换代理

热门文章

  1. 【专题5: 硬件设计】 之 【62.案例四:简易空气净化器,完整原理图】
  2. C#根据银行卡号获取银行
  3. 达梦数据库导出、导入操作
  4. android连接airprint打印机,苹果让无线打印更加便捷,安卓已羡慕
  5. gerber文件怎么导贴片坐标_如何学习贴片机编程
  6. windows10,忘记密码,不用u盘就可以修改密码
  7. vs2019使用方法
  8. IBM8800存储,光钎交换机384B,主机Linux,二代支付前置
  9. canal.adapter启动报错Could not resolve placeholder ‘HOSTNAME%%.*‘
  10. Matlab与灰色模型预测