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

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

要回复文章请先登录注册

看不清的世界

看不清的世界

回复 lifeng_dev :
大佬解决了没?,我也遇到和你一样的问题,能否分享下
2020-03-20 14:18
Sinea

Sinea (作者)

回复 coldwin :
都是参考借鉴 互相学习哈哈
2019-12-25 11:12
coldwin

coldwin

非常感谢 解决了我的问题
2019-12-25 09:29
Sinea

Sinea (作者)

回复 s***@outlook.com :
谢谢o(∩_∩)o
2019-12-21 16:21
s***@outlook.com

s***@outlook.com

好文哎
2019-12-21 12:58
lifeng_dev

lifeng_dev

回复 Sinea :
这个目前不太清楚,就是偶发的,然后只要点开pda自带的demo就能用了
2019-12-20 14:56
Sinea

Sinea (作者)

回复 lifeng_dev :
会不会是设备问题 之前我开发的时候 无论是否监听或者使用其他不用开启扫描的软件 按下扫描按钮 都会发出红光
2019-12-20 09:11
lifeng_dev

lifeng_dev

回复 Sinea :
感谢你的回复。。不过我没用你的代码,实现大致一样,我的情况是:有时候按下pda自带的scan按钮,没反应,没那个红光出现,也不能扫描
2019-12-19 17:04
Sinea

Sinea (作者)

回复 lifeng_dev :
你说的有时候扫描没反应,会不会是代码问题,把plus.webview.currentWebview对比缓存页面id的代码注释掉试试呢
2019-12-19 11:22
lifeng_dev

lifeng_dev

我目前遇到的问题:
利用监听广播获取到pda终端的scan扫描按钮的扫描结果,也能正常返回
唯一的问题就是,有时候会出现,按下pda自带的scan按钮,没反应,必须要点开(或者说重启)pda自带的一个安卓demo(估计是原生做的,里面有扫描后是振动还是声音的设置,有广播的相关设置,就是你的广播监听的代码要和里面的数据写的一样)
然后scan按钮才能用(就是有那个红色的扫描灯光)
2019-12-19 10:40