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() }