安卓对接扫码枪,扫码枪模拟键盘输入

方案一

在页面添加个隐藏的input 框,在input框内获取值,来得到扫码枪的值。
获取焦点,软键盘弹出不易隐藏。

方案二

标准扫描枪扫描数据会触发KEYCODE_ENTER键,感兴趣的同学可以在onKeyEvent函数里打log,看看这个扫描过程中                                出发的keyCode和条形码(或二维码)内容比较。

重写 onKeyDown

import android.os.Bundle;
import android.view.KeyEvent;
import android.widget.TextView;import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCompatActivity implements ScannerGunManager.OnScanListener {TextView barcodeView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);barcodeView = findViewById(R.id.barcode);ScannerGunManager.getInstance().setScanListener(this);}@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {if (keyCode == KeyEvent.KEYCODE_HOME) {return true;}boolean ret = super.onKeyDown(keyCode, event);ScannerGunManager.getInstance().dispatchKeyEvent(keyCode, event);return ret;}@Overridepublic void onResult(final String code) {runOnUiThread(new Runnable() {@Overridepublic void run() {barcodeView.setText(code);}});}
}

ScannerGunManager.java

import android.os.Handler;
import android.text.TextUtils;
import android.view.KeyEvent;import java.util.ArrayList;public class ScannerGunManager {private ArrayList<Integer> scannedCodes = new ArrayList<Integer>();private final static long MESSAGE_DELAY = 1000;private final Handler mHandler;private Runnable mScanningFinishRunnable = new Runnable() {@Overridepublic void run() {handleKeyCodes();}};public interface OnScanListener {void onResult(String code);}private OnScanListener listener;private volatile static ScannerGunManager sInstance;private ScannerGunManager() {mHandler = new Handler();}public static ScannerGunManager getInstance() {if (sInstance == null) {synchronized (ScannerGunManager.class) {if (sInstance == null) {sInstance = new ScannerGunManager();}}}return sInstance;}public String keyCodeToChar(int code, boolean isShift) {switch (code) {case KeyEvent.KEYCODE_SHIFT_LEFT:case KeyEvent.KEYCODE_SHIFT_RIGHT:case KeyEvent.KEYCODE_SPACE:case KeyEvent.KEYCODE_DPAD_DOWN:case KeyEvent.KEYCODE_DPAD_UP:return "";case KeyEvent.KEYCODE_0:return isShift ? ")" : "0";case KeyEvent.KEYCODE_1:return isShift ? "!" : "1";case KeyEvent.KEYCODE_2:return isShift ? "@" : "2";case KeyEvent.KEYCODE_3:return isShift ? "#" : "3";case KeyEvent.KEYCODE_4:return isShift ? "$" : "4";case KeyEvent.KEYCODE_5:return isShift ? "%" : "5";case KeyEvent.KEYCODE_6:return isShift ? "^" : "6";case KeyEvent.KEYCODE_7:return isShift ? "&" : "7";case KeyEvent.KEYCODE_8:return isShift ? "*" : "8";case KeyEvent.KEYCODE_9:return isShift ? "(" : "9";case KeyEvent.KEYCODE_A:return isShift ? "A" : "a";case KeyEvent.KEYCODE_B:return isShift ? "B" : "b";case KeyEvent.KEYCODE_C:return isShift ? "C" : "c";case KeyEvent.KEYCODE_D:return isShift ? "D" : "d";case KeyEvent.KEYCODE_E:return isShift ? "E" : "e";case KeyEvent.KEYCODE_F:return isShift ? "F" : "f";case KeyEvent.KEYCODE_G:return isShift ? "G" : "g";case KeyEvent.KEYCODE_H:return isShift ? "H" : "h";case KeyEvent.KEYCODE_I:return isShift ? "I" : "i";case KeyEvent.KEYCODE_J:return isShift ? "J" : "j";case KeyEvent.KEYCODE_K:return isShift ? "K" : "k";case KeyEvent.KEYCODE_L:return isShift ? "L" : "l";case KeyEvent.KEYCODE_M:return isShift ? "M" : "m";case KeyEvent.KEYCODE_N:return isShift ? "N" : "n";case KeyEvent.KEYCODE_O:return isShift ? "O" : "o";case KeyEvent.KEYCODE_P:return isShift ? "P" : "p";case KeyEvent.KEYCODE_Q:return isShift ? "Q" : "q";case KeyEvent.KEYCODE_R:return isShift ? "R" : "r";case KeyEvent.KEYCODE_S:return isShift ? "S" : "s";case KeyEvent.KEYCODE_T:return isShift ? "T" : "t";case KeyEvent.KEYCODE_U:return isShift ? "U" : "u";case KeyEvent.KEYCODE_V:return isShift ? "V" : "v";case KeyEvent.KEYCODE_W:return isShift ? "W" : "w";case KeyEvent.KEYCODE_X:return isShift ? "X" : "x";case KeyEvent.KEYCODE_Y:return isShift ? "Y" : "y";case KeyEvent.KEYCODE_Z:return isShift ? "Z" : "z";case KeyEvent.KEYCODE_COMMA:return isShift ? "<" : ",";case KeyEvent.KEYCODE_PERIOD:return isShift ? ">" : ".";case KeyEvent.KEYCODE_SLASH:return isShift ? "?" : "/";case KeyEvent.KEYCODE_BACKSLASH:return isShift ? "|" : "\\";case KeyEvent.KEYCODE_APOSTROPHE:return isShift ? "\"" : "'";case KeyEvent.KEYCODE_SEMICOLON:return isShift ? ":" : ";";case KeyEvent.KEYCODE_LEFT_BRACKET:return isShift ? "{" : "[";case KeyEvent.KEYCODE_RIGHT_BRACKET:return isShift ? "}" : "]";case KeyEvent.KEYCODE_GRAVE:return isShift ? "~" : "`";case KeyEvent.KEYCODE_EQUALS:return isShift ? "+" : "=";case KeyEvent.KEYCODE_MINUS:return isShift ? "_" : "-";case KeyEvent.KEYCODE_NUMPAD_SUBTRACT:return "-";case KeyEvent.KEYCODE_NUMPAD_DIVIDE:return "/";case KeyEvent.KEYCODE_NUMPAD_MULTIPLY:return "*";case KeyEvent.KEYCODE_NUMPAD_DOT:return ".";case KeyEvent.KEYCODE_NUMPAD_ADD:return "+";case KeyEvent.KEYCODE_NUMPAD_COMMA:return ",";case KeyEvent.KEYCODE_NUMPAD_EQUALS:return "=";case KeyEvent.KEYCODE_NUMPAD_LEFT_PAREN:return "(";case KeyEvent.KEYCODE_NUMPAD_RIGHT_PAREN:return ")";default:return "?";}}private void handleKeyCodes() {int count = scannedCodes.size();if (count <= 0) {return;}String result = "";boolean hasShift = false;for (int keyCode : scannedCodes) {result += keyCodeToChar(keyCode, hasShift);hasShift = (keyCode == KeyEvent.KEYCODE_SHIFT_LEFT);}if (!TextUtils.isEmpty(result) && listener != null) {listener.onResult(result);}scannedCodes.clear();}public boolean dispatchKeyEvent(int keyCode, KeyEvent event) {if (event.getDeviceId() == -1) {return false;}if (keyCode != KeyEvent.KEYCODE_ENTER) {scannedCodes.add(keyCode);mHandler.removeCallbacks(mScanningFinishRunnable);mHandler.postDelayed(mScanningFinishRunnable, MESSAGE_DELAY);} else {mHandler.removeCallbacks(mScanningFinishRunnable);handleKeyCodes();}return true;}public void setScanListener(OnScanListener listener) {this.listener = listener;}
}

安卓,Android,Scanner Gun,Barcode Scanner,条码,扫描枪,二维码,键盘模式相关推荐

  1. 【Android App】人脸识别中扫描识别二维码实战解析(附源码和演示 超详细)

    需要源码请点赞关注收藏后评论区留言私信~~~ 一.扫描识别二维码 不仅可以利用zxing库生成二维码,同样利用zxing库可以扫描二维码并解析得到原始文本,此时除了给build.gradle添加如下一 ...

  2. 一码多用:扫描一个二维码自动跳转支付宝/微信小程序、安卓/iosAPP

    随着支付宝,微信小程序的慢慢崛起,现在很多公司同一款程序都开发了四个版本.支付宝/微信小程序.安卓/iosAPP.但是随着程序的增加,引导用户使用就成了问题.比如,一家店门口如何贴一张二维码.实现用户 ...

  3. Android Studio 扫描识别二维码(包含闪光灯和本地二维码)、生成二维码、生成带logo的二维码

    一.测试如下: 1.扫描识别二维码,扫描结果多少 2.生成二维码.生成带logo的二维码 二.添加依赖: 1.在Project的build.gradle中添加maven { url 'https:// ...

  4. Android zxing扫描本地二维码图片NotFoundException

    使用zxing,io.github.xudaojie.qrcodelib扫描本地二维码图片时总是NotFoundException 下面是我的图片 使用手机摄像头扫描没问题,但是从相册中选一直NotF ...

  5. Aztec 条码和 QR 二维码

    一个是有很多点的黑白方块,另一个是带有--更多点的黑白方块? 对于未受过训练的人来说, Aztec 条码和 QR 码在结构上看起来相似,但它们的设计和适用性却大不相同. 但这些区别是什么? 它们最常用 ...

  6. 想用二维码推广应用,如何保证 Andriod 用户和 iOS 用户扫描同一个二维码后获得相应的 App ?

    想用二维码推广应用,如何保证 Andriod 用户和 iOS 用户扫描同一个二维码后获得相应的 App ? 这个问题纠结了好些天,后来想到的办法是:把桥页地址生成二维码,扫描后跳到桥页,在桥页判断平台 ...

  7. HTML5实现扫描识别二维码/生成二维码

    扫描识别二维码 思路: 1. 操作摄像头,获取图片.HTML5 WEBRTC的navigator.getUserMedia方法去实时获取摄像头资源.  2. 利用canvas使用相关算法分析图片识别图 ...

  8. 微信扫描普通二维码进入小程序

    微信扫描普通二维码进入小程序的方法,和代码没有什么关系,主要是在小程序平台进行设置 1. 开发配置 开发 -- 开发管理 -- 开发设置 -- 扫普通链接二维码打开小程序 2. 配置规则 根据说明配置 ...

  9. 开放平台–扫描微信二维码登录

    准备 如不了解第三方登录流程,建议先大概了解一下,在来看看代码. 说明: 由于开放平台无测试号测试,所以只能上开放平台进行配置信息.公众平台的测试号并不能给开放平台使用. 微信开放平台地址:https ...

  10. 微信扫描普通二维码调起体验版与已发布版的小程序

    文章转自: 微信扫描普通二维码调起体验版与已发布版的小程序_baozaobenren的博客-CSDN博客 公司有这样一个需求,就是用微信扫描二维码直接调起我们的小程序,前期不知道,直接扫描二维码,调起 ...

最新文章

  1. Geany整体增加减少缩进快捷键
  2. 找工作这几天遇到的骗人套路
  3. 工控设备 如何将数据发送到串口_AB PLC和西门子PLC之间需要交换数据
  4. sony z2 android 5.0,索尼Xperia Z2 5.0 root教程_索尼Z2获取5.0系统的root
  5. 常用的排序算法总结(一)
  6. 推荐几个手机网站在线预览测试工具
  7. MATLAB随机数的应用ppt,Matlab生成随机数.ppt
  8. 计算机网络有那些参考文献,计算机网络参考文献
  9. python下载电影天堂_python电影天堂
  10. [乐意黎]Nginx 重写wordpress路径于二级子目录方法
  11. 竣达技术丨Modbus 转SNMP网络监控终端
  12. C++面向对象程序设计大作业:魔兽世界(三):开战
  13. USB Type-C 转音频+快充方案简介
  14. python之panda模块1
  15. python中给变量赋值时、既确定了变量的值_Python 中的变量赋值不需要类型声明,可以直接赋值,通过值来决定变量的类型。_学小易找答案...
  16. 制作基于XKT-510和T3168芯片的无线供电模块
  17. typescript (一) 数据类型之 基础数据类型
  18. Thymeleaf模板入门(三)
  19. 好玩的API调用之---天气预报的API调用与爬虫
  20. 基于CefSharp技术构建一个票根半自动下载器

热门文章

  1. 如何将计算机基础拷到u盘上,怎么把电脑上的CAD拷贝到u盘里
  2. csapp-buflab
  3. matlab绘图笔记
  4. Java:使用POI导出Excel文件后打开文件提示因为文件格式或文件扩展名无效而无法打开
  5. 核芯基站_更新CLE版本
  6. angular 自定义打包文件名
  7. 前端工程师必备:前端的模块化
  8. Python开发《外星人入侵》游戏项目,付详细代码和注释
  9. 书友汇德天-创作不停,学习不止(十字交叉线画法)
  10. 训练人物和摩托车的yolov4-tiny模型教程