5.6 KiB
5.6 KiB
DT50 扫描识别 —— 广播参数与接入说明
面向 APP「协作」页「扫描识别」功能。 设备:优博讯 UROVO DT50(Android 11)。 参数来源:设备实测 adb logcat 抓真实扫码 + 优博讯官方 ScanManager 文档 + DCloud UniApp 官方示例 三方交叉验证。 记录日期:2026-07-20。
一、核心参数(最重要)
| 项目 | 值 | 说明 |
|---|---|---|
| 输出方式 | Intent / 广播 | 设备当前已是此模式,无需在设置页切换 |
| 广播 Action | android.intent.ACTION_DECODE_DATA |
实测 + 官方一致 |
| 条码文本(String) | barcode_string |
官方常量 BARCODE_STRING_TAG,首选 |
| 原始字节(byte[]) | barcode |
官方常量 DECODE_DATA_TAG,兜底用 |
| 长度(int) | length |
官方常量 BARCODE_LENGTH_TAG |
| 码制(int/String) | barcodeType |
官方常量 BARCODE_TYPE_TAG,实测读出 Code128 |
| 扫描键 keycode | 523 |
KEYCODE_SCAN(机身侧键) |
二、设备侧验证结论
- 硬件:成像头正常,成功解出 Code128 条码 ✅
- 触发:侧键 keycode = 523,按下发
ACTION_KEYCODE_SCAN_PRESSED - 广播:成功解码时实测发出
android.intent.ACTION_DECODE_DATA (has extras)并被接收 ✅ - 模式:当前即广播输出(非键盘输出),直接 registerReceiver 即可
- 无需:原生
.aar插件 / 自定义基座 / USB 驱动 / 完整 AndroidStudio 套壳;标准基座即可
相关系统组件(备查):
- 扫描设置 App:
com.ubx.barcodescanner.tool - 扫描服务:
com.ubx.uscanner - DataWedge 式配置:
com.ubx.datawedge
三、UniApp 监听代码(标准基座,无需插件)
let scanReceiver = null;
/** 开始监听 DT50 扫描广播 */
function startScanListener(onBarcode) {
const main = plus.android.runtimeMainActivity();
const IntentFilter = plus.android.importClass('android.content.IntentFilter');
const filter = new IntentFilter();
filter.addAction('android.intent.ACTION_DECODE_DATA'); // DT50 广播 Action
scanReceiver = plus.android.implements('io.dcloud.feature.internal.reflect.BroadcastReceiver', {
onReceive: function (context, intent) {
plus.android.importClass(intent);
// 首选直接取字符串
let code = intent.getStringExtra('barcode_string');
// 兜底:部分场景用字节数组
if (!code) {
const bytes = intent.getByteArrayExtra('barcode');
if (bytes) code = plus.android.newObject('java.lang.String', bytes);
}
const type = intent.getStringExtra('barcodeType'); // 码制,可选
if (code) onBarcode(code, type);
}
});
main.registerReceiver(scanReceiver, filter);
}
/** 停止监听(务必在页面卸载时调用,避免重复注册 / 内存泄漏) */
function stopScanListener() {
if (scanReceiver) {
plus.android.runtimeMainActivity().unregisterReceiver(scanReceiver);
scanReceiver = null;
}
}
页面接入:
onLoad() {
startScanListener((code, type) => {
this.barcode = code;
// TODO: 调 MES 后端接口 / 查料
});
},
onUnload() {
stopScanListener();
}
注意:仅 App(plus 环境)下可用,H5/小程序无
plus,接入时需做平台判断(#ifdef APP-PLUS)。
四、故障排查
| 现象 | 原因 / 处理 |
|---|---|
| 收不到广播 | 确认扫描设置里输出为「Intent/广播」而非「键盘/输入法」;确认 Action 拼写 |
| 扫描后文本框被输入内容 | 键盘输出模式也开了,去扫描设置关掉键盘输出 |
barcode_string 为空 |
用兜底的 barcode(byte[]) 转 String |
| 一直解码失败(红光有但不出码) | 距离 15 |
五、参考
- 优博讯官方 ScanManager 文档:https://en.urovo.com/developer/android/device/ScanManager.html
- DCloud UniApp 监听优博讯扫码广播(含示例):https://ask.dcloud.net.cn/article/36468
六、本仓库接入位置(2026-07-20)
| 项 | 位置 |
|---|---|
| 菜单入口 | src/common/work.ts → 其他服务「合同」后「扫描识别」 |
| 页面 | src/pages/scanIdentify/scanIdentify.vue |
| 广播工具 | src/utils/dt50Scan.ts |
| 行为 | 仅广播展示条码/码制/时间,不调后端、不弹输入法 |
| 生命周期 | onShow 注册 / onHide+onUnload 注销;同码防抖 |
七、键盘输出 vs 广播输出
| 键盘输出(Keyboard / 楔入) | 广播输出(Intent / Broadcast) | |
|---|---|---|
| 原理 | 把条码当成「敲键盘」打进当前焦点输入框 | 系统发广播,App 用 registerReceiver 收 |
| App 是否要抢焦点 | 要,通常还会弹出软键盘 | 不需要输入框焦点 |
| 适合场景 | 记事本、任意输入框快速验证 | 业务页稳定取码、拿码制等扩展字段 |
| 本页策略 | 已关闭楔入,避免弹输入法 | 本页只走广播 |
设备设置建议:扫描设置 → 关闭「键盘输出」,开启「Intent/广播输出」。
本页进入时会主动 hideKeyboard,不自动聚焦任何输入框。
附:参数是如何抓到的(可复现)
# adb 路径(本机 Android SDK)
ADB="C:/Users/hp/AppData/Local/Android/Sdk/platform-tools/adb.exe"
$ADB devices -l # 确认 DT50 已连(USB 调试)
$ADB logcat -c # 清空日志缓冲
$ADB shell "timeout 40 logcat -v threadtime '*:V'" > scan.log # 抓 40s
# 抓取期间用 DT50 侧键扫几次条码,然后:
grep -E "ACTION_DECODE_DATA|barcodeType|DECODER" scan.log