Files
2026-07-30 18:04:37 +08:00

77 lines
2.1 KiB
JavaScript

export const SCAN_BROADCAST_ACTION = 'android.intent.action.SCANRESULT'
export const SCAN_BROADCAST_EXTRA = 'value'
const DUPLICATE_WINDOW_MS = 80
let receiver = null
let activity = null
let lastScan = { value: '', receivedAt: 0 }
export function normalizeScanValue(value) {
if (value === null || value === undefined) return ''
return String(value).trim()
}
export function isDuplicateScan(value, receivedAt = Date.now()) {
const duplicate = value === lastScan.value && receivedAt - lastScan.receivedAt < DUPLICATE_WINDOW_MS
if (!duplicate) lastScan = { value, receivedAt }
return duplicate
}
export function resetScanDeduplication() {
lastScan = { value: '', receivedAt: 0 }
}
export function startScanBroadcast({ onScan, onError } = {}) {
if (typeof onScan !== 'function') return () => {}
// #ifdef APP-PLUS
try {
if (receiver) stopScanBroadcast()
activity = plus.android.runtimeMainActivity()
const IntentFilter = plus.android.importClass('android.content.IntentFilter')
const filter = new IntentFilter()
filter.addAction(SCAN_BROADCAST_ACTION)
receiver = plus.android.implements('io.dcloud.feature.internal.reflect.BroadcastReceiver', {
onReceive(context, intent) {
try {
plus.android.importClass(intent)
const value = normalizeScanValue(intent.getStringExtra(SCAN_BROADCAST_EXTRA))
if (!value || isDuplicateScan(value)) return
onScan(value)
} catch (error) {
if (typeof onError === 'function') onError(error)
}
}
})
const Build = plus.android.importClass('android.os.Build')
if (Build.VERSION.SDK_INT >= 33) {
const Context = plus.android.importClass('android.content.Context')
activity.registerReceiver(receiver, filter, Context.RECEIVER_EXPORTED)
} else {
activity.registerReceiver(receiver, filter)
}
} catch (error) {
receiver = null
activity = null
if (typeof onError === 'function') onError(error)
}
// #endif
return stopScanBroadcast
}
export function stopScanBroadcast() {
// #ifdef APP-PLUS
if (activity && receiver) {
try {
activity.unregisterReceiver(receiver)
} catch (_) {}
}
// #endif
receiver = null
activity = null
resetScanDeduplication()
}