5***@qq.com
5***@qq.com
  • 发布:2022-09-20 16:00
  • 更新:2024-09-26 16:10
  • 阅读:5183

使用uniapp开发ZEBRA(斑马 TC21/TC26)PDA,开启/关闭激光红外,接收扫描数据

分类:uni-app

公司要为斑马PDA开发app,使用技术是uniapp,需求是当管理后台给PDA分配扫码权限后,PDA才能启动激光红外扫码功能,否则不能启动扫码,最开始的实现思路是当拥有扫码权限,就处理扫描出来的数据,没有扫码权限就不处理扫描出来的数据(注:当没有扫码权限时,按下物理的扫描按键也会出现激光),老板说不行,必须是没有权限不能启动激光红外线,也就是没有权限,按了物理的扫描按键,也不能出现激光。

带着需求在斑马官网找到了对应的API,因此记录一下自己开发过程,方便以后查找,也方便即将遇到同样问题的同学

ZEBRA(斑马) DataWedge 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();
        }
  }

1 关注 分享
c***@163.com

要回复文章请先登录注册

1***@qq.com

1***@qq.com

我运行到PDA的浏览器 就监听不到扫码了 青天大老爷们 有遇到过嘛
2024-09-26 16:10
9***@qq.com

9***@qq.com

回复 5***@qq.com :
难道就看不出来吗?
//处理自己的业务逻辑
//code为扫码取得的值
2024-08-20 15:54
5***@qq.com

5***@qq.com

请问接受的扫描数据是在哪里看
2024-08-09 09:35