完美解决uniapp检测USB抄码枪连接、扫码功能

2024-08-26 21:20

本文主要是介绍完美解决uniapp检测USB抄码枪连接、扫码功能,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

效果展示

uniapp实现检测usb抄码枪连接、扫码功能

不支持IOS设备,有涉及到原生代码。

前语

做这个需求前,查阅了大量的技术文档,并且发现在dcloud已经有相关插件可以实现,但就是需要购买插件。自己也研究了很久并决定开源,希望能有帮助各位
在这里插入图片描述

简单来说,检测usb抄码枪就是检测usb外接设备,监测抄码功能就是检测外接键盘的输入事件。
这里将完整需求拆分成俩个独立小需求去单独实现,至于怎么样去做处理就根据自己需求来灵活调整。

检测usb外接设备

核心代码如下

export const watchUsb = () =>{const isWatchConnectUsb = store.getters.getWatchConnectUsbStatus;// 已经注册过就不注册了 防止重复注册if (isWatchConnectUsb) return;try {const main = plus.android.runtimeMainActivity();const receiver = plus.android.implements('io.dcloud.feature.internal.reflect.BroadcastReceiver', {onReceive: getReceive});const IntentFilter = plus.android.importClass('android.content.IntentFilter');const Intent = plus.android.importClass('android.content.Intent');const filter = new IntentFilter();const actionAttached = "android.hardware.usb.action.USB_DEVICE_ATTACHED";const actionDetached = "android.hardware.usb.action.USB_DEVICE_DETACHED";filter.addAction(actionAttached);filter.addAction(actionDetached);main.registerReceiver(receiver, filter);// 更新状态,防止重复注册store.commit('SET_WATCH_CONNECT_USB_STATUS', true);function getReceive(context, intent) {store.commit('SET_USBGUN_WATCH', true);const type = intent.getAction();if (type === actionAttached) {uni.showToast({ title: "USB扫码枪已连接", icon: "none" });uni.$emit('changeUsbGunStatus', true);store.commit('SET_USBGUN_STATUS', true);} else if (type === actionDetached) {uni.showToast({ title: "USB扫码枪已拔出", icon: "none" });uni.$emit('changeUsbGunStatus', false);store.commit('SET_USBGUN_STATUS', false);}}} catch (e) {console.error('注册USB广播接收器时发生错误:', e);}
}

我这做的处理是在App.vue下的onLaunch,app一创建就去执行监听事件,做到全局去检测usb插入拔出。并且做了防止重复监听的行为,防止bug出现

扫码功能

USB抄码扫描一次会触发多个input事件,最后再触发一次enter事件,这里就去监听input事件去不断拼接拿到映射的抄码值,最后的enter事件触发就是完整的结果
plus.key.addEventListener("keyup",this.usbGunKeypress);

// usb码枪检测事件changeUsbGunStatus(flag){this.$store.commit('SET_USBGUN_STATUS', flag);// 只有在连接usb扫码枪  并且之前没有注册过才注册监听扫码事件const isAddKeyupEventScanPage = JSON.parse(uni.getStorageSync('isAddKeyupEventScanPage') || 'false')if(flag && !isAddKeyupEventScanPage){plus.key.addEventListener("keyup",this.usbGunKeypress);uni.setStorageSync('isAddKeyupEventScanPage',true)}else{plus.key.removeEventListener("keyup",this.usbGunKeypress);uni.setStorageSync('isAddKeyupEventScanPage',false)}},
// usb扫码事件usbGunKeypress(e){//66就是回车键if(e.keyCode===66){//这里的this.inputCache就是抄码结果 做后续业务需求处理}else{this.inputCache += keymap[String(e.keyCode)] || ''}},

标题文本样式列表图片链接目录代码片表格注脚注释自定义列表LaTeX 数学公式插入甘特图插入UML图插入Mermaid流程图插入Flowchart流程图插入类图快捷键
标题复制

映射表文件keymap.js

// keymap.js 以下来源网络收集,不同的设备对应的keyCode可能不同
export default {"7": "0","8": "1","9": "2","10": "3","11": "4","12": "5","13": "6","14": "7","15": "8","16": "9","29": "A","30": "B","31": "C","32": "D","33": "E","34": "F","35": "G","36": "H","37": "I","38": "J","39": "K","40": "L","41": "M","42": "N","43": "O","44": "P","45": "Q","46": "R","47": "S","48": "T","49": "U","50": "V","51": "W","52": "X","53": "Y","54": "Z","55": ",","56": ".","59": "","69": "-","70": "=","81": "+"
}

最后有帮助到各位的话 还请不吝赐赞

这篇关于完美解决uniapp检测USB抄码枪连接、扫码功能的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1109713

相关文章

Debian 13升级后网络转发等功能异常怎么办? 并非错误而是管理机制变更

《Debian13升级后网络转发等功能异常怎么办?并非错误而是管理机制变更》很多朋友反馈,更新到Debian13后网络转发等功能异常,这并非BUG而是Debian13Trixie调整... 日前 Debian 13 Trixie 发布后已经有众多网友升级到新版本,只不过升级后发现某些功能存在异常,例如网络转

504 Gateway Timeout网关超时的根源及完美解决方法

《504GatewayTimeout网关超时的根源及完美解决方法》在日常开发和运维过程中,504GatewayTimeout错误是常见的网络问题之一,尤其是在使用反向代理(如Nginx)或... 目录引言为什么会出现 504 错误?1. 探索 504 Gateway Timeout 错误的根源 1.1 后端

解决升级JDK报错:module java.base does not“opens java.lang.reflect“to unnamed module问题

《解决升级JDK报错:modulejava.basedoesnot“opensjava.lang.reflect“tounnamedmodule问题》SpringBoot启动错误源于Jav... 目录问题描述原因分析解决方案总结问题描述启动sprintboot时报以下错误原因分析编程异js常是由Ja

深度剖析SpringBoot日志性能提升的原因与解决

《深度剖析SpringBoot日志性能提升的原因与解决》日志记录本该是辅助工具,却为何成了性能瓶颈,SpringBoot如何用代码彻底破解日志导致的高延迟问题,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言第一章:日志性能陷阱的底层原理1.1 日志级别的“双刃剑”效应1.2 同步日志的“吞吐量杀手”

MySQL 表空却 ibd 文件过大的问题及解决方法

《MySQL表空却ibd文件过大的问题及解决方法》本文给大家介绍MySQL表空却ibd文件过大的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录一、问题背景:表空却 “吃满” 磁盘的怪事二、问题复现:一步步编程还原异常场景1. 准备测试源表与数据

Mac电脑如何通过 IntelliJ IDEA 远程连接 MySQL

《Mac电脑如何通过IntelliJIDEA远程连接MySQL》本文详解Mac通过IntelliJIDEA远程连接MySQL的步骤,本文通过图文并茂的形式给大家介绍的非常详细,感兴趣的朋友跟... 目录MAC电脑通过 IntelliJ IDEA 远程连接 mysql 的详细教程一、前缀条件确认二、打开 ID

解决Nginx启动报错Job for nginx.service failed because the control process exited with error code问题

《解决Nginx启动报错Jobfornginx.servicefailedbecausethecontrolprocessexitedwitherrorcode问题》Nginx启... 目录一、报错如下二、解决原因三、解决方式总结一、报错如下Job for nginx.service failed bec

SysMain服务可以关吗? 解决SysMain服务导致的高CPU使用率问题

《SysMain服务可以关吗?解决SysMain服务导致的高CPU使用率问题》SysMain服务是超级预读取,该服务会记录您打开应用程序的模式,并预先将它们加载到内存中以节省时间,但它可能占用大量... 在使用电脑的过程中,CPU使用率居高不下是许多用户都遇到过的问题,其中名为SysMain的服务往往是罪魁

基于Java和FFmpeg实现视频压缩和剪辑功能

《基于Java和FFmpeg实现视频压缩和剪辑功能》在视频处理开发中,压缩和剪辑是常见的需求,本文将介绍如何使用Java结合FFmpeg实现视频压缩和剪辑功能,同时去除数据库操作,仅专注于视频处理,需... 目录引言1. 环境准备1.1 项目依赖1.2 安装 FFmpeg2. 视频压缩功能实现2.1 主要功

使用Python实现无损放大图片功能

《使用Python实现无损放大图片功能》本文介绍了如何使用Python的Pillow库进行无损图片放大,区分了JPEG和PNG格式在放大过程中的特点,并给出了示例代码,JPEG格式可能受压缩影响,需先... 目录一、什么是无损放大?二、实现方法步骤1:读取图片步骤2:无损放大图片步骤3:保存图片三、示php