uniapp或安卓对接扫码枪

背景介绍

最近老板又随便丢过来一个扫码枪让我研究快速上线,我心想着又是什么串口通信吗,结果发现是usb的,我想着是不是有什么协议,结果直接插上电脑或者手机 均可在输入框直接输入,不用任何的代码编写

但结合了一下实际场景,我们需要一个全局的没有编辑框的输入监听才能满足的我们的需求,比如一扫就跳转一扫就去支付等处理业务

基本概念

1.条形码和二维码都对应固定文本也就是字符串,本身没有业务逻辑是我们程序赋予此业务逻辑

2.扫码枪本质原理是识别条形码和二维码后进行外接键盘输入

监听输入

uniapp实现

	const onConfirm = (code : string) => {
		console.log('拿到的code', code);
		// 此处写我们自己的逻辑 这里我只是举例 具体根据你们自己业务如何解析
		let str = code;
		// 使用 split 方法根据冒号分割字符串  
		let parts = str.split(":");
		// 检查是否至少有 3 个部分(两个冒号)  
		if (parts.length >= 3) {
			// 提取第二个部分(索引为 1,因为索引从 0 开始)  
			let extracted = parts[1];
			console.log(extracted); // 输出: DD240531143948587 
			// 给相关页面页发消息进行切换
			if (extracted) {
				// 后面可以添加更严格的判断
				
				// 发给menu
				uni.$emit('scanCode', extracted);
				// 发给发给子页面
				uni.$emit('scanCodeDetail', extracted);

				return
			}
		} else {
			console.log("字符串格式不正确,没有足够的冒号");
		}
		uni.showToast({
			title: "非本应用格式暂不支持",
			icon: "none",
			duration: 2e3
		});
	}

	const keypress = (e : any) => {
		console.log('keypress e', JSON.stringify(e), codeToStr(e.keyCode));
		if (e.keyCode === 66 || e.key == 'Enter') {
			inputString.value = inputCache.value;
			onConfirm(inputString.value)
			inputCache.value = '';

		} else {
			// #ifdef APP-PLUS
			inputCache.value += codeToStr(e.keyCode) || ''
			// #endif 
			// #ifdef H5
			inputCache.value += e.key
			// #endif

		}
	}


	onLoad((options) => {
		console.log("index onLoad")
		// #ifdef APP-PLUS
		plus.key.addEventListener("keyup", keypress);
		// #endif 
		// #ifdef H5
		document.addEventListener("keyup", keypress);
		// #endif
	})
	onUnload(() => {
		console.log("index onUnload")
		// #ifdef APP-PLUS
		plus.key.removeEventListener("keyup", keypress)
		// #endif
		// #ifdef H5
		document.removeEventListener("keyup", keypress)
		// #endif
	})

原生实现

    override fun dispatchKeyEvent(event: KeyEvent?): Boolean {
        if (event?.action == KeyEvent.ACTION_DOWN) {
            val keyCode = event.keyCode
            if (mScanGun?.isMaybeScanning(keyCode, event) == true) {
                return true
            }
        }
        return super.dispatchKeyEvent(event)
    }

实际过程中都能得到event,但直接获取code又有问题,下面给个我目前使用支持中文和数字的转化,我也一直没有找到完整的,感觉像asicll码偏移了,只能限制业务逻辑中只有数字英文和固定字符,如果有字符需求 ,直接自己生成一个二维码然后去扫出来看看是什么

uniapp

// keymap.js 以下来源网络收集,不同的设备对应的keyCode可能不同
// 随手给的设备没有文档只能自己苦逼研究解码 发现少了就自己加,目前为安卓平台测试结果
// 大概率是ASCII偏移了
let keyMap = {
	"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": "+",
	"74": ":",
	
}

export function codeToStr(code: keyof typeof keyMap) : String {
	return keyMap[code]
}

我这边直接就把keyCode 转化成字符串拼接完事了

其他人的工具类

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package com.chice.scangun;

import android.view.KeyEvent;

public class ScanGun {
    public static final int MAX_KEYS_INTERVAL_DEFAULT = 20;
    private long currentTime = 0L;
    private boolean isKeySHIFT = false;
    private StringBuilder stringBuilder = new StringBuilder();
    private ScanGunCallBack callBack = null;
    private static int maxKeysInterval = 20;

    public static void setMaxKeysInterval(int interval) {
        maxKeysInterval = interval;
    }

    public ScanGun(ScanGunCallBack callBack) {
        this.callBack = callBack;
    }

    public boolean isMaybeScanning(int keyCode, KeyEvent event) {
        if (event.getFlags() != 8) {
            return false;
        } else {
            if (this.currentTime == 0L) {
                if (this.stringBuilder.length() > 0) {
                    this.stringBuilder = this.stringBuilder.delete(0, this.stringBuilder.length());
                }

                this.currentTime = System.currentTimeMillis();
            } else {
                if (System.currentTimeMillis() - this.currentTime > (long)maxKeysInterval && this.stringBuilder.length() > 0) {
                    this.stringBuilder = this.stringBuilder.delete(0, this.stringBuilder.length());
                }

                this.currentTime = System.currentTimeMillis();
            }

            if (keyCode == 59) {
                this.isKeySHIFT = true;
            }

            if (keyCode == 66) {
                this.isKeySHIFT = false;
                this.currentTime = 0L;
                if (this.callBack != null) {
                    this.callBack.onScanFinish(this.stringBuilder.toString());
                }

                return true;
            } else {
                if (keyCode >= 7 && keyCode <= 16) {
                    this.handleTopNumKeys(keyCode);
                } else if (keyCode >= 29 && keyCode <= 54) {
                    this.checkShift((char)(keyCode + 68), (char)(keyCode + 36));
                } else {
                    if (keyCode < 144 || keyCode > 158) {
                        switch (keyCode) {
                            case 55:
                                this.checkShift(',', '<');
                                break;
                            case 56:
                                this.checkShift('.', '>');
                                break;
                            case 57:
                            case 58:
                            case 59:
                            case 60:
                            case 61:
                            case 63:
                            case 64:
                            case 65:
                            case 66:
                            case 67:
                            default:
                                return false;
                            case 62:
                                this.stringBuilder.append(' ');
                                break;
                            case 68:
                                this.checkShift('`', '~');
                                break;
                            case 69:
                                this.checkShift('-', '_');
                                break;
                            case 70:
                                this.checkShift('=', '+');
                                break;
                            case 71:
                                this.checkShift('[', '{');
                                break;
                            case 72:
                                this.checkShift(']', '}');
                                break;
                            case 73:
                                this.checkShift('\\', '|');
                                break;
                            case 74:
                                this.checkShift(';', ':');
                                break;
                            case 75:
                                this.checkShift('\'', '"');
                                break;
                            case 76:
                                this.checkShift('/', '?');
                        }

                        return true;
                    }

                    this.handleNumPadKeys(keyCode);
                }

                return true;
            }
        }
    }

    private void checkShift(char ascallNoShift, char ascallOnShift) {
        if (this.isKeySHIFT) {
            this.stringBuilder.append(ascallOnShift);
            this.isKeySHIFT = false;
        } else {
            this.stringBuilder.append(ascallNoShift);
        }

    }

    private void handleNumPadKeys(int keyCode) {
        if (keyCode <= 153) {
            this.stringBuilder.append((char)(keyCode - 96));
        } else if (keyCode == 154) {
            this.stringBuilder.append('/');
        } else if (keyCode == 155) {
            this.stringBuilder.append('*');
        } else if (keyCode == 156) {
            this.stringBuilder.append('-');
        } else if (keyCode == 157) {
            this.stringBuilder.append('+');
        } else if (keyCode == 158) {
            this.stringBuilder.append('.');
        }

    }

    private void handleTopNumKeys(int keyCode) {
        if (keyCode >= 7 && keyCode <= 16) {
            switch (keyCode) {
                case 7:
                    this.checkShift('0', ')');
                    break;
                case 8:
                    this.checkShift('1', '!');
                    break;
                case 9:
                    this.checkShift('2', '@');
                    break;
                case 10:
                    this.checkShift('3', '#');
                    break;
                case 11:
                    this.checkShift('4', '$');
                    break;
                case 12:
                    this.checkShift('5', '%');
                    break;
                case 13:
                    this.checkShift('6', '^');
                    break;
                case 14:
                    this.checkShift('7', '&');
                    break;
                case 15:
                    this.checkShift('8', '*');
                    break;
                case 16:
                    this.checkShift('9', '(');
            }

        }
    }

    public interface ScanGunCallBack {
        void onScanFinish(String var1);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/743714.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MFC案例:自制工具条(Toolbar)按钮的小程序

程序目标&#xff1a;在基于对话框的MFC项目中&#xff0c;自制三个 Toolbar 按钮&#xff08;用颜色区分&#xff0c;分别为红、绿、蓝&#xff09;&#xff1b;程序运行时&#xff0c;单击红色按钮显示一个红色的填充椭圆&#xff1b;再单击绿色按钮则进行清屏&#xff1b;最…

基于AT89C52单片机的超声波测距设计—数码管显示

点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/89456475?spm=1001.2014.3001.5503 C 源码+仿真图+毕业设计+实物制作步骤+10 在这里插入图片描述 题 目: 基于52的超声波测距汽车防撞系统 学生姓名 [姓名] 学 号 [学号…

力扣921. 使括号有效的最少添加

Problem: 921. 使括号有效的最少添加 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 1.定义int变量res、need分别记录需要插入的左括号数和所需与左括号配对的右括号数&#xff1b; 2.遍历字符串&#xff1a; 2.1.若当为左括号&#xff0c;则need&#xff0c;表示…

QT拖放事件之八:通过全局剪切板中的接口QClipboard::mimeData()来获取MIME类型数据

1、演示效果 首先向剪切板写入数据,然后点击paste按钮进行从全局剪切板中 获取 MIME数据。。。 2、核心代码 void Widget::on_pasteBtn_clicked() {const QClipboard* clipBoard = QGuiApplication::clipboard()

win10修改远程桌面端口,Windows 10下修改远程桌面端口及服务器关闭445端口的操作指南

Windows 10下修改远程桌面端口及服务器关闭445端口的操作指南 一、修改Windows 10远程桌面端口 在Windows 10系统中&#xff0c;远程桌面连接默认使用3389端口。为了安全起见&#xff0c;建议修改此端口以减少潜在的安全风险。以下是修改远程桌面端口的步骤&#xff1a; 1. 打…

qt 简单实验 一个可以向右侧拖拽缩放的矩形

1.概要 目的是设置一个可以拖拽缩放的矩形&#xff0c;这里仅用右侧的一个边模拟这个过程。就是为了抓住核心&#xff0c;这个便解决了&#xff0c;其他的边也是一样的。而这个更能体现原理。 2.代码 2.1 resizablerectangle.h #ifndef RESIZABLERECTANGLE_H #define RESIZ…

瞄准Windows的新兴僵尸网络:Kraken

2021 年 10 月&#xff0c;ZeroFox Intelligence 披露了名为 Kraken 的僵尸网络。Kraken 通过 SmokeLoader 进行传播&#xff0c;每次更新攻击基础设施时都会扩大规模。尽管与 2008 年发现的 Kraken 僵尸网络同名&#xff0c;但二者并没有其他共同点。 功能 自从 2021 年 10 …

Redis 集群 - 数据分片算法

前言 广义的集群&#xff1a;只要是多个机器构成了一个分布式系统&#xff0c;都可以被称为集群。 狭义的集群&#xff1a;redis 的集群模式&#xff0c;这个集群模式下&#xff0c;主要是解决存储空间不足的问题。 Redis 集群 redis 采用主从结构&#xff0c;可以提高系统的可…

【FFmpeg】avformat_open_input函数

【FFmpeg】avformat_open_input函数 1.avformat_open_input1.1 初始化输入格式&#xff08;init_input&#xff09;1.1.1 文件路径判断格式&#xff08;av_probe_input_format2&#xff09;1.1.1.1 格式探测&#xff08;read_probe&#xff09;1.1.1.2 扩展匹配检查&#xff08…

【链表经典算法OJ题】(2)

4.链表的中间节点 单链表相关经典算法OJ题4&#xff1a; 链表的中间结点 . - 力扣&#xff08;LeetCode&#xff09;. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problem…

mmpose姿态估计

OpenMMLab GitHubOpenMMLab has 49 repositories available. Follow their code on GitHub.https://github.com/open-mmlab Installation — MMPose 1.3.1 documentationhttps://mmpose.readthedocs.io/en/latest/installation.html Body 3D Keypoint — MMPose 1.3.1 docume…

Linux_应用篇(27) CMake 入门与进阶

在前面章节内容中&#xff0c;我们编写了很多示例程序&#xff0c;但这些示例程序都只有一个.c 源文件&#xff0c;非常简单。 所以&#xff0c;编译这些示例代码其实都非常简单&#xff0c;直接使用 GCC 编译器编译即可&#xff0c;连 Makefile 都不需要。但是&#xff0c;在实…

关于导入springcloud项目一些jar加载不进去的问题处理

IntelliJ IDEA的Maven项目有时候通过右边Maven Projects面板的package或者install命令打包的时候&#xff0c;会报错导致打包失败&#xff0c;这是由于这两个命令打包前默认会运行tests测试&#xff0c;若测试失败则打包失败。但是有时候我们打包的时候一些项目配置是针对生产环…

Studio One 6.6.2中文破解版安装图文激活教程

Studio One 6.6.2中文破解版做为新生代音乐工作站&#xff0c;凭借更低的价格和完备的功能&#xff0c;获得了音乐人和直播行业工作者的青睐&#xff0c;尤其是对硬件声卡的适配支持更好&#xff0c;特别适合用来配合线上教学和电商带货。 最近网上出现不少关于StudioOne不能用…

吃鸡报错:请重新安装软件xinput1_3.dll怎么办,分享几种靠谱的解决方法

xinput1_3.dll 是 Microsoft DirectX 的一个重要组件&#xff0c;主要用于处理游戏控制器和其他输入设备的交互操作。当运行支持 DirectX 的游戏或程序时&#xff0c;xinput1_3.dll 文件会被操作系统加载到内存中&#xff0c;以提供输入设备的相关功能。如果 xinput1_3.dll 文件…

51单片机STC89C52RC——8.1 8*8 LED点阵模块(点亮一个LED)

目录 目的/效果 一&#xff0c;STC单片机模块 二&#xff0c;8*8 LED点阵模块 2.1 电路图 2.1.1 8*8 点阵模块电路图 2.1.2 74HC595&#xff08;串转并&#xff09;模块 电路图 2.1.3 芯片引脚 2.2 引脚电平分析 2.3 74HC595 串转并模块 2.3.1 装弹&#xff08;移位…

计算机网络之入门

1.网络的发展 1.1计算机网络定义 计算机网络是以共享资源&#xff08;硬件、软件和数据等&#xff09;为目的而连接起来的、在协议控制下&#xff0c;由一台或多台计算机、若干台终端设备、数据传输设备等组成的系统之集合。 这些计算机系统应当具有独立自治的能力&#xff…

PHP+laravel 生成word

此功能较为繁琐我会从源头讲起 首先是数据库设置&#xff0c;下面是我的数据库结构 合同模版表 CREATE TABLE contract_tpl (id bigint unsigned NOT NULL AUTO_INCREMENT,name varchar(191) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT 合同名称,file varchar(191) COLL…

redis集群简单介绍及其搭建过程

Redis集群 1、哨兵模式 哨兵可以有多个&#xff0c;从服务器也可以有多个&#xff0c;从服务器也可以有多个&#xff0c;在Redis3.0以前的版本要实现集群一般是借助哨兵sentinel工具来监控master节点的状态&#xff0c;如果master节点异常&#xff0c;则会实现主从切换&#x…

WMV 视频格式怎么转换?WMV 视频为什么不流行了?

目前有越来越多的视频格式类型&#xff0c;如常见的 MP4、FLV、AVI 等等&#xff0c;而技术的演变也逐渐让一些常见的视频格式变的越来越少了。 今天我们一起来聊下 WMV 这个视频格式&#xff0c;让我们看看它的发展以及为什么现在越来越少人使用了。 什么是 WMV 视频格式&…