公司要为斑马PDA开发app,使用技术是uniapp,需求是当管理后台给PDA分配扫码权限后,PDA才能启动激光红外扫码功能,否则不能启动扫码,最开始的实现思路是当拥有扫码权限,就处理扫描出来的数据,没有扫码权限就不处理扫描出来的数据(注:当没有扫码权限时,按下物理的扫描按键也会出现激光),老板说不行,必须是没有权限不能启动激光红外线,也就是没有权限,按了物理的扫描按键,也不能出现激光。
带着需求在斑马官网找到了对应的API,因此记录一下自己开发过程,方便以后查找,也方便即将遇到同样问题的同学
1、拿出斑马PDA充电、并开机,手指在主屏幕上,向上滑动,找到应用“DataWedge”,如图
2、点击“DataWedge”,启动Profile0(default)文件,并配置Intent输出,禁用Launcher和DWDemo配置文件,如图
3、好了,斑马PDA已经设置好了,现在开始用uniapp做开发了,主要代码如下
var scanObj = {};
//是否开启激光红外线扫描,true开启,false关闭
Vue.prototype.isOpenLaserScan = (isOpen) => {
scanObj.main = plus.android.runtimeMainActivity();//获取activity
var Intent = plus.android.importClass('android.content.Intent');
scanObj.intent = new Intent();
scanObj.intent.setAction("com.symbol.datawedge.api.ACTION");
scanObj.intent.putExtra("com.symbol.datawedge.api.ENABLE_DATAWEDGE", isOpen);
scanObj.main.sendBroadcast(scanObj.intent);
}
//初始化扫描设备
Vue.prototype.initScan = (fun) => {
scanObj.main = plus.android.runtimeMainActivity();//获取activity
var IntentFilter = plus.android.importClass('android.content.IntentFilter');
scanObj.filter = new IntentFilter();
scanObj.filter.addAction("com.dwexample.ACTION"); // 换你的广播动作 com.service.scanner.data(海康威视的PDA)
scanObj.receiver = plus.android.implements('io.dcloud.feature.internal.reflect.BroadcastReceiver',{
onReceive: function(context, intent) {
plus.android.importClass(intent);
let code = intent.getStringExtra("com.motorolasolutions.emdk.datawedge.data_string");// 换你的广播标签 ScanCode(海康威视的PDA)
if(typeof(fun) === 'function'){
fun(code);
}
}});
}
//启动扫描设备
Vue.prototype.startScan = () => {
try{
scanObj.main.registerReceiver(scanObj.receiver,scanObj.filter);
}catch(e){
//TODO handle the exception
}
}
//停止扫描设备
Vue.prototype.stopScan = () => {
try{
scanObj.main.unregisterReceiver(scanObj.receiver);
}catch(e){
//TODO handle the exception
}
}
4、在生命周期onShow函数中调用扫码,页面调用如下
onShow(){
//监听页面显示。页面每次出现在屏幕上都触发,包括从下级页面点返回露出当前页面
let _this = this;
//是否开启激光红外线扫描,默认开启
_this.isOpenLaserScan(true);
//判断是否拥有当前页面的扫码权限,这里是自己业务的权限判断
if (!_this.hasPerm('PutBaseFlour:scan')) {
uni.showModal({
title: '提示',
content: '你没有扫码权限,无法开启激光扫码,请联系管理员!',
showCancel: false
});
setTimeout(() => {
//是否开启激光红外线扫描,没有相应的权限则关闭
_this.isOpenLaserScan(false);
}, 500);
return;
}
_this.initScan((code) => {
//处理自己的业务逻辑
//code为扫码取得的值
});
_this.startScan();
}
5、使用完成后需要销毁,由于app、h5、ios、微信等所支持的生命周期有所不同,建议在以下生命周期中销毁防止没有销毁掉的情况,避免多次进入页面扫码后取得多个值
onHide(){
//监听页面隐藏
if (this.hasPerm('PutBaseFlour:scan')) {
this.stopScan();
}
},
onUnload(){
//监听页面卸载
if (this.hasPerm('PutBaseFlour:scan')) {
this.stopScan();
}
},
onBackPress(){
//监听页面返回
if (this.hasPerm('PutBaseFlour:scan')) {
this.stopScan();
}
},
destroyed:function(){
//页面退出时一定要卸载监听,否则下次进来时会重复,造成扫一次出2个以上的结果
if (this.hasPerm('PutBaseFlour:scan')) {
this.stopScan();
}
}