1.前言
- PDA扫码是工厂项目中是非常常见的功能,这里记录下工作中的开发思路和模板,仅供参考
- PDA扫码模式:模拟输入和广播模式
- 模拟输入:模拟键盘输入,一般后面会设置追加一个回车,优点是通用型强,缺点是每次扫描前需要先获取焦点,且弹出的软键盘会遮挡页面布局
- 广播模式:通过底层的广播进行事件驱动,优点是无须获取焦点,可随意扫码,缺点是需要进行适配(根据不同的设备型号适配对应的广播名称),二是如果页面有多个输入框,则需要额外的逻辑进行当前扫描属于哪个输入框
2.流程步骤
// #ifdef APP
//初始化pda扫码
import pda from '@/libs/util/pda.js'
pda.initScan()
// #endif
- 页面监听:当广播扫码触发时,触发当前页面的handlePdaScan方法
<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 APP
main = plus.android.runtimeMainActivity() //获取activity
var context = plus.android.importClass('android.content.Context') //上下文
var IntentFilter = plus.android.importClass('android.content.IntentFilter')
filter = new IntentFilter()
//获取action
var action = getAction()
filter.addAction(action)
receiver = plus.android.implements('io.dcloud.feature.internal.reflect.BroadcastReceiver', {
onReceive: (context, intent) => {
//能接收到广播说明当前设备为pda设备(未启用)
getApp().globalData.isPda = true
plus.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