新闻详情

新闻详情

首页 / 资讯中心 / 详情

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

发布时间:2026/9/25 5:05:35来源:尧图网络
安卓,Android,Scanner Gun,Barcode Scanner,条码,扫描枪,二维码,键盘模式
安卓对接扫码枪扫码枪模拟键盘输入方案一在页面添加个隐藏的input 框在input框内获取值来得到扫码枪的值。 获取焦点软键盘弹出不易隐藏。方案二标准扫描枪扫描数据会触发KEYCODE_ENTER键感兴趣的同学可以在onKeyEvent函数里打log看看这个扫描过程中 出发的keyCode和条形码或二维码内容比较。重写 onKeyDownimport 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; Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); barcodeView findViewById(R.id.barcode); ScannerGunManager.getInstance().setScanListener(this); } Override public 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; } Override public boolean dispatchKeyEvent(KeyEvent event) { // 优先处理扫码器事件 boolean isScannerEvent ScannerGunManager.getInstance().dispatchKeyEvent(event.getKeyCode(), event); Log.d(Scanner, 是否扫码事件 isScannerEvent); if (isScannerEvent) { return true; // 完全阻断事件传递 } // 其他全局按键处理如HOME键 if (event.getKeyCode() KeyEvent.KEYCODE_HOME event.getAction() KeyEvent.ACTION_DOWN) { return true; } return super.dispatchKeyEvent(event); } Override public void onResult(final String code) { runOnUiThread(new Runnable() { Override public void run() { barcodeView.setText(code); } }); } }ScannerGunManager.javaimport android.os.Handler; import android.text.TextUtils; import android.view.KeyEvent; import java.util.ArrayList; public class ScannerGunManager { private ArrayListInteger scannedCodes new ArrayListInteger(); private final static long MESSAGE_DELAY 1000; private final Handler mHandler; private Runnable mScanningFinishRunnable new Runnable() { Override public 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; } }
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

OES Plus刷Armbian后SATA硬盘系统扩容实战指南 2026/9/25 5:42:46

OES Plus刷Armbian后SATA硬盘系统扩容实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
MATLAB量子算法实现:从矩阵运算拆解叠加态与纠缠 2026/9/25 5:42:40

MATLAB量子算法实现:从矩阵运算拆解叠加态与纠缠

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
WPScan 插件版本动态检测解析:以 Pirate Forms 的 CHANGELOG.md 指纹文件为例 2026/9/25 5:42:34

WPScan 插件版本动态检测解析:以 Pirate Forms 的 CHANGELOG.md 指纹文件为例

网络安全漏洞扫描渗透测试应用安全CLI 【免费下载链接】wpscan WPScan WordPress security scanner. Written for security professionals and blog maintainers to test the security of their WordPress websites. Contact us via contactwpscan.com 项目地址: ht…

阅读更多 →
BAML 函数调用链基准测试解析:call-chain-100x10k 的设计原理与运行方法 2026/9/25 5:42:33

BAML 函数调用链基准测试解析:call-chain-100x10k 的设计原理与运行方法

编程语言AI Agent编译器CLI人工智能 【免费下载链接】baml The programming language for agents 项目地址: https://gitcode.com/gh_mirrors/ba/baml 点击查看 免费下载 导读 本文围绕 BAML 语言内置基准测试工具 speedtest 中的一个核心负载——call-chain-100x…

阅读更多 →
PaddleNLP 检索重排实战:基于 RocketQA CrossEncoder 单塔模型的全流程训练、评估与 Serving 部署指南 2026/9/25 5:42:27

PaddleNLP 检索重排实战:基于 RocketQA CrossEncoder 单塔模型的全流程训练、评估与 Serving 部署指南

人工智能大模型预训练微调LoRARLHF强化学习分布式训练 【免费下载链接】PaddleNLP Easy-to-use and powerful LLM and SLM library with awesome model zoo. 项目地址: https://gitcode.com/gh_mirrors/pa/PaddleNLP 点击查看 免费下载 本文聚焦 PaddleNLP 神经语义…

阅读更多 →
openapi-typescript Node.js API 实战指南:程序化类型生成、transform 钩子扩展与源码管线解析 2026/9/25 5:42:27

openapi-typescript Node.js API 实战指南:程序化类型生成、transform 钩子扩展与源码管线解析

开发工具代码生成后端 【免费下载链接】openapi-typescript Generate TypeScript types from OpenAPI 3 specs 项目地址: https://gitcode.com/gh_mirrors/op/openapi-typescript 点击查看 免费下载 本文基于 openapi-typescript 仓库中的 Node.js API 文档&#x…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉