1.前言
- PDA扫码是工厂项目中是非常常见的功能,这里记录下工作中的开发思路和模板,仅供参考
- PDA扫码模式:模拟输入和广播模式
- 模拟输入:模拟键盘输入,一般后面会设置追加一个回车,优点是通用型强,缺点是每次扫描前需要先获取焦点,且弹出的软键盘会遮挡页面布局
- 广播模式:通过底层的广播进行事件驱动,优点是无须获取焦点,可随意扫码,缺点是需要进行适配(根据不同的设备型号适配对应的广播名称),二是如果页面有多个输入框,则需要额外的逻辑进行当前扫描属于哪个输入框
2.广播扫描
- 启动App时进行初始化,广播触发时,拿到当前页面,并触发固定的方法(main.js)
// #ifdef APP
//初始化pda扫码
import pda from '@/libs/util/pda.js'
pda.initScan()
// #endif
<script>
export default{methods: {//对接pda扫码handlePdaScan(code){},}
}
</script>
- 不推荐使用公共组件:一是每个页面都需要引入和销毁,增加代码体积,二是后台页面也会响应扫描,增加出bug的风险
3.广播扫描代码
var main = null
var filter = null
var receiver = null//适配的pda列表
var pdaList = []//当前设备型号
var model = plus.device.model.toLowerCase()var pda = {initScan() {// #ifdef APPmain = plus.android.runtimeMainActivity() //获取activityvar context = plus.android.importClass('android.content.Context') //上下文var IntentFilter = plus.android.importClass('android.content.IntentFilter')filter = new IntentFilter()//获取actionvar action = getAction()filter.addAction(action)receiver = plus.android.implements('io.dcloud.feature.internal.reflect.BroadcastReceiver', {onReceive: (context, intent) => {//能接收到广播说明当前设备为pda设备(未启用)getApp().globalData.isPda = trueplus.android.importClass(intent)var name = getName()var code = intent.getStringExtra(name)//拿到当前页面var nowPage = getCurrentPages().pop()//调用当前页面的方法,将结果传递过去nowPage.$vm.handlePdaScan && nowPage.$vm.handlePdaScan(code)}})main.registerReceiver(receiver, filter)// #endif}
}//匹配Action
function getAction(){var target = pdaList.find(item=>{return item.model.toLowerCase() == model})if(target){return target.action}else{return "com.juqent.scan"}
}//匹配name
function getName(){var target = pdaList.find(item=>{return item.model.toLowerCase() == model})if(target){return target.name}else{return "data"}
}export default pda