基于uniapp实现监听PDA扫码功能,以霍尼韦尔(EDA50P)为例,可根据默认广播适配多厂商PDA【保姆级】

本文介绍了如何在不知晓PDA设备的扫码API时,通过配置广播和标签在Uniapp中监听PDA设备的扫描事件。包括如何在Honeywell设备上进行设置,获取设备品牌以及提供示例代码来实现扫描功能的初始化和停止。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一. PDA设置

在不知道PDA设备扫码api的情况下,可通过配置广播和标签让程序进行监听。大多数pda设备默认不开启,需手动开启,以霍尼韦尔为例

  1. 进入设置找到《Honeywell设置》

在这里插入图片描述
2. 进入《扫描设置》

在这里插入图片描述
3. 进入《Internal Scanner》

在这里插入图片描述

  1. 添加配置

建议针对你开发的app进行单独配置,也可使用默认的配置文件【不建议】,使用默认配置(Default profile)的可以忽略此步骤

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  1. 进入配置打开《Data Processing Settings》
    在这里插入图片描述
  2. 最后一步勾选《Data Intent》

勾选后是厂家默认的广播动作和标签,点击《Data intent》可进入查看和重设
默认广播动作: com.honeywell.scan.broadcast
默认标签: data
也可根据需求自行修改

在这里插入图片描述
在这里插入图片描述
二. 获取PDA设备厂家用来区分不同设备

要知道什么pda的默认广播动作、标签字段 然后预设在代码里面来区分不同pda厂家 后面用对应的广播动作字段即可

uni.getSystemInfoSync().deviceBrand

三.uniapp实现监听PDA扫码功能【完整代码】

  1. 创建预设配置文件PresetsPda.js
const deviceBrand = uni.getSystemInfoSync().deviceBrand;

// 目前已知的广播动作和广播标签 后续可继续叠加
// 自定义广播动作和标签也可进行预设
export const actionData = [{
		// 霍尼韦尔(默认广播和标签)
		deviceBrand: 'mobiwire',
		action: 'com.honeywell.scan.broadcast',
		stringExtra: 'data',
	},
	{
		// 优博讯(默认广播和标签)
		deviceBrand: 'urovo',
		action: 'android.intent.ACTION_DECODE_DATA',
		stringExtra: 'barcode_string',
	}
]

// 首页进入页面 将本设备的信息存入本地  如果该厂商没在预设中 就拿第一个位置的配置,根据项目中使用的PDA自行决定
export const setCurrentDeviceAction = () => {
	// 如果本地有存广播信息 就不拿了
	if (uni.getStorageSync('currentDeviceData')?.deviceBrand) return
	const data = actionData.find(item => deviceBrand === item.deviceBrand)
	if (data && Object.keys(data).length) {
		uni.setStorageSync('currentDeviceData', data)
	} else {
		uni.setStorageSync('currentDeviceData', actionData[0])
	}

};
  1. 创建扫描功能文件scanModule.js
let main, receiver, filter;
let _codeQueryTag = false; // 标记变量

export const initScan = () => {
  
  main = plus.android.runtimeMainActivity(); // 获取主 activity
  var IntentFilter = plus.android.importClass("android.content.IntentFilter");
  filter = new IntentFilter();
  const action = uni.getStorageSync('currentDeviceData').action // 获取动作
  const stringExtra = uni.getStorageSync('currentDeviceData').stringExtra // 获取字符串额外参数
  filter.addAction(action); // 添加广播动作
  receiver = plus.android.implements(
    "io.dcloud.feature.internal.reflect.BroadcastReceiver",
    {
      onReceive: function (context, intent) {
        plus.android.importClass(intent);
        let code = intent.getStringExtra(stringExtra); // 获取广播中的字符串额外参数
        queryCode(code);
      },
    }
  );
};


export const startScan = () => {
  main.registerReceiver(receiver, filter); // 开始监听广播
};
export const stopScan = () => {
  main.unregisterReceiver(receiver); // 停止监听广播
  // 解绑 uni 全局事件监听器,否则可能会出错
  uni.$off('SCAN_CODE');
};
export const queryCode = (code) => {
  // 防止重复查询
  if (_codeQueryTag) return false;
  _codeQueryTag = true; // 标记为已经查询
  setTimeout(function () {
    _codeQueryTag = false; // 重置标记
  }, 150);
  var id = code;
  //id 就是扫码的结果
  uni.$emit("SCAN_CODE", { code: id }); // 触发 SCAN_CODE 事件,并传递扫描到的内容
};
  1. 项目中初始化扫码功能

可在扫码前置页面进行调用或者全局配置

onLoad() {
			// 将本设备的信息存入本地
			setCurrentDeviceAction();
			// 初始化
			initScan();
		},
  1. 页面中扫码功能使用
mounted() {
	// #ifndef H5
		initScan();
		startScan();
		uni.$on("SCAN_CODE", ({code}) => {
			// code就是扫码的结果 接下来写业务需求
		});
	// #endif
},
destroyed() {
	// #ifndef H5
	//页面销毁就取消接受扫码结果
	stopScan();
	// #endif
},

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值