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

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

要回复文章请先登录注册

Sinea

Sinea (作者)

回复 2***@qq.com :
不清楚哦 之前只适配了文章中的两款
2020-08-29 17:25
3***@qq.com

3***@qq.com

每一款扫描枪都不一样,到现在我只集成了新大陆和优博讯两款
2020-08-26 14:38
2***@qq.com

2***@qq.com

回复 Sinea :
你好,请问是所有的pda扫描枪都不用打包插件都能这样直接调用还是只有这一种扫描枪可以这么用?
2020-08-26 12:18
Sinea

Sinea (作者)

回复 2***@qq.com :
是的
2020-08-23 16:05
2***@qq.com

2***@qq.com

回复 2***@qq.com :
不引用原生插件直接调用js代码吗
2020-08-14 21:12
2***@qq.com

2***@qq.com

请问这需要引入原生插件吗?
2020-08-14 21:11
puyonghang

puyonghang

回复 9***@qq.com :
参考一下https://wenku.baidu.com/view/c2034dc2bf23482fb4daa58da0116c175e0e1e22.html;
通过这个可以实现
2020-05-20 14:41
9***@qq.com

9***@qq.com

霍尼韦尔扫描枪 怎么在设备上设置监听的对象名啊
2020-05-09 17:39
Sinea

Sinea (作者)

回复 雍和 :
“首先在打开页面时把页面id存储到本地” 当时处理是每个页面加载的时候
2020-03-27 19:35
雍和

雍和

两个页面切换的处理方式,能不能具体说明一下(主要是比对的值是在什么时候赋值的 谢谢)
2020-03-27 09:22