chore: initial commit
This commit is contained in:
@@ -0,0 +1,76 @@
|
||||
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()
|
||||
}
|
||||
Reference in New Issue
Block a user