Sinea
Sinea
  • 发布:2018-09-21 13:56
  • 更新:2022-01-13 12:02
  • 阅读:18057

PDA终端扫描实现

分类:HTML5+

以下方法都是非原生方式实现

Javascript获取扫码结果实现

document.onkeydown=function(e){  
    //webview不需要兼容ie  
    console.log(e.keyCode)  
}

该方法需要判断按键和间隔输入情况,用户可能在扫码的时候有其他按键等误操作,所以不建议用来进行获取扫码结果。

Native.js监听广播消息实现

参考论坛 回答

function plusReady() {   
    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.zkc.scancode");//监听扫描  
    main.registerReceiver(receiver,filter);//注册监听  

    function doReceive(context, intent) {   
        plus.android.importClass(intent);//通过intent实例引入intent类,方便以后的‘.’操作  
        var Number = intent.getStringExtra("code");   
        console.log(Number);  
        main.unregisterReceiver(receiver);//取消监听  
    }  
}

销邦X8扫描枪

我这里使用的是销邦科技X8扫描设备,由于设备不一样导致文章中的代码不能直接使用,需要配置监听的数据才能连接。搜索销邦官网获取对应开发包下载

开发包截图

注意设置内勾选开启扫描,选择输入模式API:

PDA设置

打开开发说明查看参数:

pdf截图

代码对应修改如下:

···  

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

···  

intent.getStringExtra("scannerdata");//返回结果  

···

原代码实现的是扫码完成就取消监听这样不符合实际业务(多次扫描),但是不取消监听用同时有打开新的页面,这时会发现之前的页面还在监听扫描,当然在打开新页面的时候进行取消监听,但是当用户从新页面返回之前的页面时又需要重启监听,各种条件判断写出了比较麻烦。

这里采用的是接受扫描结果时判断是否是当前显示页面。首先在打开页面时把页面id存储到本地,并且重写back:

function pageInit(){  
    var _self = plus.webview.currentWebview()  
    localStorage.setItem('WEBVIEW_ID', _self.id)  
    mui.back = function() {  
        localStorage.setItem('WEBVIEW_ID', _self.opener().id)  
        _self.close()  
    }  
}

然后判断页面id:

function scan(callback){  
    var main = plus.android.runtimeMainActivity(); //获取activity  
    var receiver = plus.android.implements('io.dcloud.feature.internal.reflect.BroadcastReceiver', {  
        onReceive: function(context, intent){//实现onReceiver回调函数  
            if(plus.webview.currentWebview().id != localStorage.getItem(util.config.WEBVIEW_ID)) return  
            callback(intent.getStringExtra('scannerdata'))  
        }   
    });  
    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'); //监听扫码广播  
    main.registerReceiver(receiver, filter); //注册监听  
}

页面使用:

mui.plusReady(function () {  
    pageInit()  
    setTimeout(function(){  
        scan(function(code){  
            console.log('扫描结果:'+code)  
        })  
    },300)  
})

注意:在HBuilder控制台没有调试信息,需要在webview调试窗口中才能看到打印信息。另建议在plusReady中延迟执行scan()。

霍尼韦尔扫描枪

首先需要在设备上去设置监听的对象名(我这里设置成和销邦设备一样的com.android.server.scannerservice.broadcast),接受参数的时候再判断一下设备plus.device.model进行切换接受返回结果的对象名:

scan: function(callback){  
    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: function(context, intent){//实现onReceiver回调函数  
        if(plus.webview.currentWebview().id != localStorage.getItem(util.config.WEBVIEW_ID)) return  
            var _key = plus.device.model == 'EDA50K' ? 'data' : 'scannerdata';  
            callback(intent.getStringExtra(_key))  
        }  
    });  
    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'); //监听扫码广播  
    main.registerReceiver(receiver, filter); //注册监听  
}
9 关注 分享
9***@qq.com c***@outlook.com skysowe lifeng_dev 7***@qq.com boboidream farce 9***@qq.com 8***@qq.com

要回复文章请先登录注册

瑞丰计算机

瑞丰计算机

优博讯PDA扫码可参考这边:https://ask.dcloud.net.cn/article/36468
2019-10-11 11:20
9***@qq.com

9***@qq.com

有大神知道吗 这个是在unpackgae下新增这个.js文件再在对应的扫描获取条码的组件里调用里面的方法吗 急谢谢大佬
2019-09-09 17:19
9***@qq.com

9***@qq.com

回复 Sinea :
问题已解决,多谢回复
2018-10-31 14:23
9***@qq.com

9***@qq.com

回复 Sinea :
我做的就是销邦的手持X6,用他们提供的Android原生demo,通过扫描键就能获取到结果,在mui中就没法监听到手持端的扫描键
2018-10-31 09:32
Sinea

Sinea (作者)

回复 9***@qq.com :
原文我编辑了下 更新了霍尼韦尔设备的适配
2018-10-31 00:10
Sinea

Sinea (作者)

回复 9***@qq.com :
要看你是什么设备 不同型号设备 监听扫描和返回结果对应的对象名不一样 比如上次适配了霍尼韦尔的扫描枪 是在设备设置中自行设置的监听对象名 filter.addAction("对象名1") 另外intent.getStringExtra('对象名2')中对象名也不一样
2018-10-31 00:01
9***@qq.com

9***@qq.com

我只能通过页面上的按钮才能获取到扫描结果,但是用手持端上的扫描键就获取不到数据,请教楼主
2018-10-30 18:05
9***@qq.com

9***@qq.com

请教一下你是怎么获取到那个扫描按钮事件的,hbuilder里只监听到了返回键
2018-10-30 18:02
李世皇朝

李世皇朝

回复 n***@qq.com :
我大概知道怎么 搞定这个了 qq:344162911
2018-10-24 09:18
n***@qq.com

n***@qq.com

想问一下楼主
2018-10-03 00:41