1.前言
- PDA掃碼是工廠項目中是非常常見的功能,這里記錄下工作中的開發(fā)思路和模板,僅供參考
- PDA掃碼模式:模擬輸入和廣播模式
- 模擬輸入:模擬鍵盤輸入,一般后面會設(shè)置追加一個回車,優(yōu)點是通用型強,缺點是每次掃描前需要先獲取焦點,且彈出的軟鍵盤會遮擋頁面布局
- 廣播模式:通過底層的廣播進(jìn)行事件驅(qū)動,優(yōu)點是無須獲取焦點,可隨意掃碼,缺點是需要進(jìn)行適配(根據(jù)不同的設(shè)備型號適配對應(yīng)的廣播名稱),二是如果頁面有多個輸入框,則需要額外的邏輯進(jìn)行當(dāng)前掃描屬于哪個輸入框
2.流程步驟
- 啟動App時進(jìn)行初始化(main.js)
// #ifdef APP
//初始化pda掃碼
import pda from '@/libs/util/pda.js'
pda.initScan()
// #endif
- 頁面監(jiān)聽:當(dāng)廣播掃碼觸發(fā)時,觸發(fā)當(dāng)前頁面的handlePdaScan方法
<script>
export default{
methods: {
//對接pda掃碼
handlePdaScan(code){
},
}
}
</script>
- 不推薦使用公共組件:一是每個頁面都需要引入和銷毀,增加代碼體積,二是后臺頁面也會響應(yīng)掃描,增加出bug的風(fēng)險
3.廣播掃描插件的代碼
var main = null
var filter = null
var receiver = null
//適配的pda列表
var pdaList = [
]
//當(dāng)前設(shè)備型號
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) => {
//能接收到廣播說明當(dāng)前設(shè)備為pda設(shè)備(未啟用)
getApp().globalData.isPda = true
plus.android.importClass(intent)
var name = getName()
var code = intent.getStringExtra(name)
//拿到當(dāng)前頁面
var nowPage = getCurrentPages().pop()
//調(diào)用當(dāng)前頁面的方法,將結(jié)果傳遞過去
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