uniapp兼容多pda扫描扫码

前景

网上有现成的针对单个pda扫码录入的代码,但是公司的需求是在多个不同厂商pda上运行,这就会导致不同的pda默认的广播动作和广播标签不一致的情况,目前也没有获取这俩字段的api。

单个pda扫描扫码代码

先创建一个scanCode.js的文件

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

export const initScan = () => {
  let _this = this;
  main = plus.android.runtimeMainActivity(); //获取activity
  var IntentFilter = plus.android.importClass("android.content.IntentFilter");
  filter = new IntentFilter();
  filter.addAction('android.intent.ACTION_DECODE_DATA'); // 换你的广播动作
  receiver = plus.android.implements(
    "io.dcloud.feature.internal.reflect.BroadcastReceiver",
    {
      onReceive: function (context, intent) {
        plus.android.importClass(intent);
        let code = intent.getStringExtra('barcode_string'); // 换你的广播标签
        queryCode(code);
      },
    }
  );
};

export const startScan = () => {
  main.registerReceiver(receiver, filter);
};
export const stopScan = () => {
  main.unregisterReceiver(receiver);
  //解绑uni的全局$on 不然会有bug
  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 });
};

使用在对应页面

mounted() {
	// #ifndef H5
		initScan();
		startScan();
		uni.$on("SCAN_CODE", ({code}) => {
			// code就是扫码的结果 接下来写业务需求
			
		});
	// #endif
},
destroyed() {
	// #ifndef H5
	//页面销毁就取消接受扫码结果
	stopScan();
	// #endif
},

兼容多个pda

无非就是更换scanCode.js中addAction和getStringExtra字段

const initScan = () => {
  filter.addAction('android.intent.ACTION_DECODE_DATA'); // 换你的广播动作
  let code = intent.getStringExtra('barcode_string'); // 换你的广播标签
};

但是没有对应的api获取当前pda的广播动作、标签字段
又不好让用户自己去设置这俩字段
我的方法是自己要知道什么pda的默认广播动作、标签字段 然后预设在代码里面 通过uni.getSystemInfoSync().deviceBrand来区分不同pda厂家 后面用对应的广播动作字段即可
创建toggleScanCode.js

const deviceBrand = uni.getSystemInfoSync().deviceBrand;

// 目前已知的广播动作和广播标签 后续叠加
/*
1、优博讯"deviceBrand": "urovo",||"deviceModel": "RT40", action:android.intent.ACTION_DECODE_DATA、StringExtra:barcode_string
2、honeywell "deviceBrand": "honeywell",||"deviceModel": "EDA50KP-3",action:com.honeywell.scan.broadcast、StringExtra:data
*/

export const actionData = [{
	deviceBrand:'urovo',
	action:'android.intent.ACTION_DECODE_DATA',
	stringExtra:'barcode_string',
},{
	deviceBrand:'honeywell',
	action:'com.honeywell.scan.broadcast',
	stringExtra:'data',
}]

// 首页进入页面 将本设备的信息存入本地  如果没预设的 就拿优博讯的 广播信息比较通用
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])
	}
};

然后再首页去调用这个方法
index.vue

onLoad() {
	// 一进入页面就获取当前设备的广播
	setCurrentDeviceAction()
},

再改scanCode.js的initScan方法

export const initScan = () => {
	if(platform==='ios') return
  let _this = this;
  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);
      },
    }
  );
};

这样就能兼容多个pda的扫码功能了 不过前提还是要知道用户pda是什么厂商 自己再去找对应厂商默认的广播动作和广播标签字段

你可能感兴趣的:(uni-app)