优博讯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)
  },
}

posted @ 2026-06-08 15:54  lambertlt  阅读(8)  评论(0)    收藏  举报