uniapp实现PDA扫码(广播模式)

1.进入开发者模式查看PDA的广播动作和广播标签

2.在uni-app项目里新建一个公共组件 就叫 pda-scan 吧,放到公共组件components中,目录:components/pda-scan/pda-scan.vue

<template>
	<view>	
	</view>
</template>

<script setup>
import { onShow,onHide,onLoad,onUnload } from '@dcloudio/uni-app'

let main, receiver, filter;
let _codeQueryTag = false;

const initScan = () => {
  main = plus.android.runtimeMainActivity(); //获取activity
  let IntentFilter = plus.android.importClass('android.content.IntentFilter');
  filter = new IntentFilter();
  filter.addAction("android.intent.action.SCANRESULT"); // 广播动作
  receiver = plus.android.implements('io.dcloud.feature.internal.reflect.BroadcastReceiver', {
    onReceive: function (context, intent) {
      plus.android.importClass(intent);
      let code = intent.getStringExtra("value"); // 广播标签
	  console.log("进入了onReceive",code);
      queryCode(code);
    }
  });
};

// 启动扫描操作,将之前创建的广播接收器(receiver)注册到活动中,以便接收指定广播动作的结果
// filter 用于过滤广播消息,只有匹配过滤器中指定的广播动作的消息才会被接收和处理
const startScan = () => {
  main.registerReceiver(receiver, filter);
};

// 停止扫描操作,将之前注册的广播接收器(receiver)从活动中注销,以停止接收扫描结果的广播
const stopScan = () => {
  main.unregisterReceiver(receiver);
};

const queryCode = (code) => {
  //防重复
  if (_codeQueryTag) return false;
  _codeQueryTag = true;
  setTimeout(function () {
    _codeQueryTag = false;
  }, 150);
  // 触发自定义事件
  uni.$emit('scancode', { code: code });
};

onShow(() => {
  initScan();
  startScan();
});

onUnload(() => {
  stopScan();
});

onHide(()=>{
	stopScan();
});
</script>

<style>

</style>

3.在需要使用到扫码的页面中使用 pda-scan 组件,并设置监听 uni.$on('scancode',function(data){}

<template>
	<view>
	    <!-- 引入组件  -->
	    <pda-scan></pda-scan>
            {{scancodes }}
	</view>
</template>

<script setup>
	
	import {onShow} from '@dcloudio/uni-app'
	import { ref } from 'vue';
    const scancodes = ref("")
    
	onShow(()=>{
		uni.$on('scancode',function(data){
			// console.log('你想要的code:', data.code)  
			var pages = getCurrentPages();
			console.log(pages[pages.length-1].route,data.code);
			scancodes.value = data.code
		})  
	})
	
	onHide(() => {
		// 移除监听事件
		uni.$off('scancode')
	})

	onUnload(() => {
		// 移除监听事件
		uni.$off('scancode')
	})
	
</script>

<style lang="scss" scoped>

</style>

4.兼容多PDA,需要记录对应品牌,型号,统计广播动作和广播标签。只需将组件中的广播动作和广播标签改为根据品牌型号动态获取即可。

posted @   强者qiang  阅读(3214)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
点击右上角即可分享
微信分享提示