125 lines
3.4 KiB
JavaScript
125 lines
3.4 KiB
JavaScript
/**
|
||
* PDA 设备扫码实现(hbyapi 广播协议,基于 QS5502 开发 demo)
|
||
*
|
||
* 设备自身带有物理扫码按键,按下即触发扫描头;
|
||
* 本模块负责「监听扫码结果广播」+「页面扫码按钮主动触发」。
|
||
*
|
||
* 协议(来自 QS5502 demo MainActivity.java):
|
||
* 触发扫描:发送广播 hbyapi.intent.key_scan_down(模拟按键按下)
|
||
* 接收结果:监听广播 com.qs.scancode,从 extra 键 data 获取扫码字符串
|
||
*
|
||
* 用法(与 scan-*.js 同构):
|
||
* const impl = new ScanPdaImpl()
|
||
* impl.init()
|
||
* impl.register((code) => {...})
|
||
* impl.startScan() // 主动触发(物理键按下同样会回传,无需手动调用)
|
||
*/
|
||
|
||
class ScanPdaImpl {
|
||
constructor() {
|
||
this._main = null
|
||
this._receiver = null
|
||
this._filter = null
|
||
this._callback = null
|
||
this._isScanning = false
|
||
}
|
||
|
||
/**
|
||
* 初始化:获取主 Activity 引用
|
||
*/
|
||
init() {
|
||
this._main = plus.android.runtimeMainActivity()
|
||
if (!this._main) {
|
||
throw new Error('[Scan-PDA] 获取主 Activity 失败')
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 注册扫码结果回调(注册 com.qs.scancode 广播接收器)
|
||
*/
|
||
register(callback) {
|
||
this._callback = callback
|
||
if (this._receiver) return
|
||
|
||
var self = this
|
||
var IntentFilter = plus.android.importClass('android.content.IntentFilter')
|
||
this._filter = new IntentFilter()
|
||
this._filter.addAction('com.qs.scancode')
|
||
|
||
this._receiver = plus.android.implements(
|
||
'io.dcloud.feature.internal.reflect.BroadcastReceiver',
|
||
{
|
||
onReceive: function (context, intent) {
|
||
plus.android.importClass(intent)
|
||
var codeStr = intent.getStringExtra('data')
|
||
if (!codeStr) return
|
||
console.log('[Scan-PDA] 扫码结果:', codeStr)
|
||
self._isScanning = false
|
||
if (self._callback) {
|
||
self._callback(codeStr)
|
||
}
|
||
}
|
||
}
|
||
)
|
||
this._main.registerReceiver(this._receiver, this._filter)
|
||
}
|
||
|
||
/**
|
||
* 注销监听(页面卸载时调用)
|
||
*/
|
||
unregister() {
|
||
if (this._receiver && this._main) {
|
||
this._main.unregisterReceiver(this._receiver)
|
||
this._receiver = null
|
||
}
|
||
this._callback = null
|
||
}
|
||
|
||
/**
|
||
* 开始扫描:发送 key_scan_down 广播主动触发扫描头
|
||
* 设备物理扫码键按下时同样会回传结果,无需手动调用此方法
|
||
*/
|
||
startScan() {
|
||
if (!this._main) return
|
||
var Intent = plus.android.importClass('android.content.Intent')
|
||
var intent = new Intent()
|
||
intent.setAction('hbyapi.intent.key_scan_down')
|
||
this._main.sendBroadcast(intent)
|
||
this._isScanning = true
|
||
console.log('[Scan-PDA] 已触发扫描广播')
|
||
}
|
||
|
||
/**
|
||
* 停止扫描
|
||
* demo 仅演示 key_scan_down;部分同协议机型支持 key_scan_up 停止,
|
||
* 这里 try-catch 发送,无副作用
|
||
*/
|
||
stopScan() {
|
||
this._isScanning = false
|
||
if (!this._main) return
|
||
try {
|
||
var Intent = plus.android.importClass('android.content.Intent')
|
||
var intent = new Intent()
|
||
intent.setAction('hbyapi.intent.key_scan_up')
|
||
this._main.sendBroadcast(intent)
|
||
} catch (e) {
|
||
console.log('[Scan-PDA] 发送停止广播失败(可忽略):', e.message)
|
||
}
|
||
}
|
||
|
||
isScanning() {
|
||
return this._isScanning
|
||
}
|
||
|
||
/**
|
||
* 完全销毁(应用退出时调用)
|
||
*/
|
||
destroy() {
|
||
this.unregister()
|
||
this._main = null
|
||
this._filter = null
|
||
}
|
||
}
|
||
|
||
export default ScanPdaImpl
|