瑞丰计算机
瑞丰计算机
  • 发布:2019-10-11 11:12
  • 更新:2024-04-17 18:11
  • 阅读:13441

在uni-app中对优博讯和新大陆安卓(Android)PDA的条码扫码广播监听(带示例附件)

分类:uni-app

我们在开发的时候需要获取优博讯PDA的条码扫码内容,根据前人的分享及自己找的一些资料整理示例代码如下,希望能帮助到有需要的人。为了避免刚入门的人无从下手,特增加了附件。

以下是示例,真正在用的时候,建议在app启动之后就开始监听,并通过全局事件来推送给需要的页面,而不是在每个页面都自己去监听,有利于代码的维护和提升性能。全局事件的监听和释放可参考我的另一个帖子:关于uni-app全局事件监听和释放监听的分享

另外优博讯的PDA需要在系统的:设置->扫描->Default->关闭(键盘方式输出) 才能使用广播监听。

onLoad() {  

            page = this;  

            this.title = "开始监听!";  

            var main = plus.android.runtimeMainActivity(); //获取activity    
            var context = plus.android.importClass('android.content.Context'); //上下文    
            var receiver = plus.android.implements('io.dcloud.feature.internal.reflect.BroadcastReceiver', {  
                onReceive: doReceive  
            });  
            var IntentFilter = plus.android.importClass('android.content.IntentFilter');  
            var Intent = plus.android.importClass('android.content.Intent');  
            var filter = new IntentFilter();  

            //针对优博讯安卓PDA-i6300A添加监听,其它优博讯的型号应该一样或类似  
            filter.addAction("android.intent.ACTION_DECODE_DATA"); //监听扫描  

            main.registerReceiver(receiver, filter); //注册监听    

            function doReceive(context, intent) {  

                //通过intent实例引入intent类,方便以后的‘.’操作    
                plus.android.importClass(intent);  

                //条码内容  
                var barcodeBytes = intent.getByteArrayExtra("barcode");  
                var barcode = byteToString(barcodeBytes);  

                //条码长度  
                var barcodeLength = intent.getIntExtra("length", 0);  
                //var myArray = new ArrayBuffer(0);  
                //条码类型  
                var barcodeTypeBytes = intent.getByteExtra("barcodeType", (0 | 0));  
                var barcodeType = byteToString(barcodeTypeBytes);  

                // uni.showModal({  
                //  content: '条码:' + barcode + '\r\n长度:' + barcodeLength + '\r\n类型:' + barcodeType,  
                //  showCancel: false  
                // });  
                page.title = barcode;  
                //console.log(barcode);    
                //main.unregisterReceiver(receiver);//取消监听    
            }  

            function byteToString(arr) {  
                if (typeof arr === 'string') {  
                    return arr;  
                }  
                var str = '',  
                    _arr = arr;  
                for (var i = 0; i < _arr.length; i++) {  
                    var one = _arr[i].toString(2),  
                        v = one.match(/^1+?(?=0)/);  
                    if (v && one.length == 8) {  
                        var bytesLength = v[0].length;  
                        var store = _arr[i].toString(2).slice(7 - bytesLength);  
                        for (var st = 1; st < bytesLength; st++) {  
                            store += _arr[st + i].toString(2).slice(2);  
                        }  
                        str += String.fromCharCode(parseInt(store, 2));  
                        i += bytesLength - 1;  
                    } else {  
                        str += String.fromCharCode(_arr[i]);  
                    }  
                }  
                return str;  
            }  

        }

下面是新大陆PDA的扫码方式

    //新大陆 智联天地 N7000R 获取方法  

    //#ifdef APP-PLUS  

            //this.title = "开始监听!";  

            var main = plus.android.runtimeMainActivity(); //获取activity    

            var context = plus.android.importClass('android.content.Context'); //上下文    

            var receiver = plus.android.implements('io.dcloud.feature.internal.reflect.BroadcastReceiver', {  

                onReceive: doReceive  

            });  

            var IntentFilter = plus.android.importClass('android.content.IntentFilter');  

            var Intent = plus.android.importClass('android.content.Intent');  

            var filter = new IntentFilter();  

            filter.addAction("com.android.server.scannerservice.broadcast"); //监听扫描  

            // filter.addAction("android.intent.extra.SCAN_DATA"); //监听扫描  

            main.registerReceiver(receiver, filter); //注册监听    

            function doReceive(context, intent) {  

                //通过intent实例引入intent类,方便以后的‘.’操作    

                plus.android.importClass(intent);  

                var barcodeBytes1 = intent.getStringExtra("scannerdata");  

                console.log(page.openCustmerScan);  

                if (page.openCustmerScan) {  

                    page.cylinderRecovery.customerId = barcodeBytes1  

                } else {  

                    page.setval(barcodeBytes1)  

                }  

            }  
    //#ifdef APP-PLUS  

            //this.title = "开始监听!";  

            var main = plus.android.runtimeMainActivity(); //获取activity    

            var context = plus.android.importClass('android.content.Context'); //上下文    

            var receiver = plus.android.implements('io.dcloud.feature.internal.reflect.BroadcastReceiver', {  

                onReceive: doReceive  

            });  

            var IntentFilter = plus.android.importClass('android.content.IntentFilter');  

            var Intent = plus.android.importClass('android.content.Intent');  

            var filter = new IntentFilter();  

            filter.addAction("com.android.server.scannerservice.broadcast"); //监听扫描  

            // filter.addAction("android.intent.extra.SCAN_DATA"); //监听扫描  

            main.registerReceiver(receiver, filter); //注册监听    

            function doReceive(context, intent) {  

                //通过intent实例引入intent类,方便以后的‘.’操作    

                plus.android.importClass(intent);  

                var barcodeBytes1 = intent.getStringExtra("scannerdata");  

                console.log(page.openCustmerScan);  

                if (page.openCustmerScan) {  

                    page.cylinderRecovery.customerId = barcodeBytes1  

                } else {  

                    page.setval(barcodeBytes1)  

                }  

            }  

            //#endif  
            //#endif
12 关注 分享
w***@163.com 1***@qq.com 7***@qq.com farce chualosue 小时光 Tomyni 国服第一后羿 2***@qq.com 2***@qq.com 2***@qq.com j***@gmail.com

要回复文章请先登录注册

wangMr

wangMr

回复 II优选 :
我问了,pda是服务于各个公司做仓储的,那些码是无法区分的,大佬,还有救吗这扫码?
2024-04-17 18:11
wangMr

wangMr

回复 II优选 :
是的,我之前做pda是有标识的,好的,谢谢大佬,我去问下
2024-04-17 08:57
II优选

II优选

回复 wangMr :
我不知道你们的应用场景,如果三个不同的类型的二维码,连一个区分标识都没有的话,那我感觉设计也是有问题的。比如:三个结果的前缀不同之类的,要让人看出来这个扫码出来的结果是做什么用的。
2024-04-17 08:52
wangMr

wangMr

回复 II优选 :
那如果格式不固定是不是无解了,哈哈哈哈
2024-04-17 08:47
wangMr

wangMr

回复 II优选 :
扫码结果区分也就是去判断扫描不同的二维码码结果的格式,对吧?
2024-04-17 08:47
II优选

II优选

回复 wangMr :
那就只能用扫码结果去区分,或者在点击扫码之后给一个参数
2024-04-17 08:40
wangMr

wangMr

回复 II优选 :
我的广播动作是唯一的,只有一种pda扫码,一个页面中多个需要用到扫码的地方就会扫码冲突,也就是共用的同一个扫码实例,我的问题就是这样的,我的解决想法是利用工厂函数生成不同的实例,但是我还不清楚如何更改
2024-04-17 08:37
II优选

II优选

回复 wangMr :
上边都是通过广播去获取的,你把每一个pda 设置的广播的通知的filter.addAction("com.android.server.scannerservice.broadcast");不一样,就会触发不同的广播回执,首先要设置每一种类型的pda 设置不一样才行
2024-04-16 18:06
wangMr

wangMr

回复 II优选 :
可以再讲的详细点吗?大佬,可能是我没描述清楚,上面这个广播动作名称跟多个扫码的情况有什么关系吗?
我的问题:同一个页面多个扫码入口,扫的是不同的码,然后扫码就会调用多次扫码实例
期望结果:扫哪个码,调用一次扫码返回对应的扫码结果
2024-04-16 17:04
II优选

II优选

回复 wangMr :
用不同的

filter.addAction("com.android.server.scannerservice.broadcast"); //监听扫描
2024-04-16 15:55