pda扫码默认只要光标聚焦到输入框扫描到的值就会自动填充到输入框中。但是有些场景并不适用,例如:同一个页面有多个输入框或者需求要求不聚焦到输入框就能扫描,此时就不符合实际业务场景了。这时,可以用广播扫码来实现,它不需要光标聚焦。
一、查看pda的广播动作和数据标签
每个品牌pda的广播动作和数据标签查看方式不同,我这里是(海康威视)pda,后面代码中需要用到
查看方式:pda自带的app 扫码工具 --- 输出配置 --- 输出模式
二、封装扫描工具类pdaScanCode.js
let main;
let filter;
let receiver;
let tag = false;
/**
* 开始广播监听扫码
*/
const start = () => {
main.registerReceiver(receiver, filter);
};
/**
* 停止广播监听扫码
*/
const stop = () => {
main.unregisterReceiver(receiver);
};
/** 剩余下个变量已经做了全局变量
*
* 定义广播
* that:传this;
*/
const init = (onReceive) => {
console.log("--------初始化广播扫码");
//获取activity
main = plus.android.runtimeMainActivity();
const IntentFilter = plus.android.importClass("android.content.IntentFilter");
filter = new IntentFilter();
// 扫描设置的广播动作 改成自己pda的广播动作 android.intent.ACTION_SCAN_OUTPUT
filter.addAction("android.intent.ACTION_SCAN_OUTPUT");
receiver = plus.android.implements(
"io.dcloud.feature.internal.reflect.BroadcastReceiver",
{
onReceive: (context, intent) => {
plus.android.importClass(intent);
// 改成自己pda的数据标签 barcode
const code = intent.getStringExtra("barcode");
// 业务
//防重复
if (tag) return;
tag = true;
setTimeout(() => {
tag = false;
}, 150);
//到这里扫描成功了,可以调用自己的业务逻辑,code就是扫描的结果 return出code进行业务处理
onReceive && onReceive(code);
},
}
);
};
export const broadcastScan = {
init,
start,
stop,
};
三、在main.js中,将broadcastScan挂在到原型链上
三、使用
onLoad: function(option) {
//init传入一个回调函数做参数,在扫描的时候会将数据传入这个方法里,然后在处理你的业务逻辑
this.$broadcastScan.init(this.getScancode);
},
onUnload() {
this.$broadcastScan.stop();
},
onHide() {
this.$broadcastScan.stop();
},
onShow() {
this.$broadcastScan.start();
},
methods: {
getScancode(code) {
console.log(code, '------------------pda硬件扫码值');
}
}
这世界很喧嚣,做你自己就好