优博讯PDA扫码信息读取
// VUE3 qs-scanlistener
<template>
<view></view>
</template>
<script setup>
import { onBeforeUnmount, onMounted } from 'vue'
import scaninput from './scanInput.js'
// 初始化扫码
scaninput.initScan()
scaninput.startScan()
// 定义 emit
const emit = defineEmits(['scan'])
// 输入值
let inputVal = ''
/**
* 键盘事件处理
*/
function onEvent(event) {
console.log('[扫码组件] 键盘事件:', event.key)
if (event.key !== 'Enter' && event.key !== 'PrintScreen') { // 拼接输入的值,Enter与PrintScreen是物理按钮要排除
inputVal = inputVal + event.key
console.log('[扫码组件] 累积输入:', inputVal)
}
if (event.key === 'Enter') {
const reg = /Shift/g // g代表全部
const reg2 = /Unidentified/g // 排除'Unidentified'字符
let val = inputVal
val = val.replace(reg, '')
val = val.replace(reg2, '')
val = val.replace(/\s/g, '')
val = val.replace(/\r\n/g, '')
val = val.replace(/\n/g, '')
console.log('[扫码组件] 清理后的值:', val)
if (val) {
console.log('[扫码组件] 触发 scan 事件(键盘模式):', val)
emit('scan', val)
}
inputVal = ''
}
}
/**
* 扫码广播处理
*/
function scanHandle(code) {
console.log('[扫码组件] 触发 scan 事件(广播模式):', code)
emit('scan', code)
}
// 挂载时安装扫码监听
onMounted(() => {
console.log('[扫码组件] 组件挂载')
console.log('[扫码组件] 当前环境:', typeof plus !== 'undefined' ? 'App (广播模式)' : '非 App (键盘模式)')
scaninput.install(scanHandle)
console.log('[扫码组件] 已安装扫码监听器')
})
// 卸载时移除扫码监听
onBeforeUnmount(() => {
scaninput.uninstall(scanHandle)
})
</script>
<script module="keyboard" lang="renderjs">
export default {
mounted() {
const onKey = (event) => {
const keys1 = ['type', 'timeStamp']
const keys2 = ['altKey', 'code', 'ctrlKey', 'isComposing', 'key', 'location', 'metaKey', 'repeat', 'shiftKey']
const keys3 = ['char', 'charCode', 'keyCode', 'keyIdentifier', 'keyLocation', 'which']
const data = {}
keys1.concat(keys2, keys3).forEach(key => data[key] = event[key])
this.$ownerInstance.callMethod('onEvent', data)
}
// 保存事件处理函数引用,以便后续移除
this._onKey = onKey
this._names = ['keyup'] //'keydown',
// 绑定事件
this._names.forEach(name => {
document.addEventListener(name, this._onKey, false)
})
},
beforeUnmount() {
// Vue 3 使用 beforeUnmount 替代 beforeDestroy
if (this._names && this._onKey) {
this._names.forEach(name => {
document.removeEventListener(name, this._onKey, false)
})
}
}
}
</script>
<style>
</style>
// scanInput.js
let main
let receiver
let filter
let _codeQueryTag = false
let temp = []
let init = false
let start = false
const isApp = typeof plus !== 'undefined'
export default {
initScan() {
// 如果不是 App 环境,直接返回
if (!isApp) {
console.log('当前非 App 环境,跳过原生扫码初始化')
return
}
if (init)
return
try {
let _this = this
main = plus.android.runtimeMainActivity() // 获取activity
let IntentFilter = plus.android.importClass('android.content.IntentFilter')
filter = new IntentFilter()
// android.intent.ACTION_DECODE_DATA
filter.addAction(uni._qs_scanlistener_action || 'android.intent.ACTION_DECODE_DATA') // 换你的广播动作,你的pda设备里面看
receiver = plus.android.implements('io.dcloud.feature.internal.reflect.BroadcastReceiver', {
onReceive(context, intent) {
// barcode_string
plus.android.importClass(intent)
let code = intent.getStringExtra(uni._qs_scanlistener_label || 'barcode_string') // 换你的广播标签,你的pda设备里面看
_this.queryCode(code)
},
})
init = true
console.log('原生扫码初始化成功')
} catch (e) {
console.error('原生扫码初始化失败:', e)
}
},
startScan() {
// 如果不是 App 环境,直接返回
if (!isApp)
return
if (!start) {
try {
start = true
main.registerReceiver(receiver, filter)
console.log('开始监听原生扫码广播')
} catch (e) {
console.error('注册广播接收器失败:', e)
}
}
},
stopScan() {
// 如果不是 App 环境,直接返回
if (!isApp)
return
if (start) {
try {
start = false
main.unregisterReceiver(receiver)
console.log('停止监听原生扫码广播')
} catch (e) {
console.error('注销广播接收器失败:', e)
}
}
},
install(fn) {
if (typeof fn === 'function' && !~temp.indexOf(fn))
temp.push(fn)
},
uninstall(fn) {
if (typeof fn === 'function') {
const index = temp.findIndex(i => i === fn)
if (~index)
temp.splice(index, 1)
}
},
queryCode(code) {
console.log('[scanInput] 接收到扫码广播:', code)
// 防重复
// if (_codeQueryTag) return false;
// _codeQueryTag = true;
// setTimeout(function() {
// _codeQueryTag = false;
// }, 150);
if (temp && temp.length) {
console.log('[scanInput] 调用回调函数,监听器数量:', temp.length)
temp[temp.length - 1](code)
} else {
console.warn('[scanInput] 没有注册的监听器!')
}
uni.vibrateShort()
uni.$emit('qs_scanlistener_handle', code)
},
}
有什么不同见解可以在评论区共同讨论

浙公网安备 33010602011771号