前景
网上有现成的针对单个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是什么厂商 自己再去找对应厂商默认的广播动作和广播标签字段