优化
This commit is contained in:
+36
-16
@@ -1,5 +1,11 @@
|
||||
export const SCAN_BROADCAST_ACTION = 'android.intent.action.SCANRESULT'
|
||||
export const SCAN_BROADCAST_EXTRA = 'value'
|
||||
export const SCAN_BROADCAST_ACTIONS = Object.freeze([
|
||||
SCAN_BROADCAST_ACTION,
|
||||
'com.android.server.scannerservice.broadcast',
|
||||
'com.sunmi.scanner.ACTION_DATA_CODE_RECEIVED'
|
||||
])
|
||||
const SCAN_BROADCAST_EXTRAS = Object.freeze(['value', 'data', 'barcode', 'SCAN_BARCODE1'])
|
||||
|
||||
const DUPLICATE_WINDOW_MS = 80
|
||||
|
||||
@@ -29,17 +35,23 @@ export function startScanBroadcast({ onScan, onError } = {}) {
|
||||
try {
|
||||
if (receiver) stopScanBroadcast()
|
||||
|
||||
activity = plus.android.runtimeMainActivity()
|
||||
const registeredActivity = 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) {
|
||||
SCAN_BROADCAST_ACTIONS.forEach((action) => filter.addAction(action))
|
||||
const registeredReceiver = plus.android.implements('io.dcloud.feature.internal.reflect.BroadcastReceiver', {
|
||||
onReceive(context, intent) {
|
||||
try {
|
||||
plus.android.importClass(intent)
|
||||
const rawValue = intent.getStringExtra(SCAN_BROADCAST_EXTRA)
|
||||
let rawValue = ''
|
||||
for (const extra of SCAN_BROADCAST_EXTRAS) {
|
||||
try {
|
||||
const candidate = intent.getStringExtra(extra)
|
||||
if (candidate !== null && candidate !== undefined && String(candidate).trim()) { rawValue = candidate; break }
|
||||
} catch (_) {}
|
||||
}
|
||||
const value = normalizeScanValue(rawValue)
|
||||
console.info('[Overseas PDA broadcast] received', { action: intent.getAction(), extra: SCAN_BROADCAST_EXTRA, rawValue, value })
|
||||
console.info('[Overseas PDA broadcast] received', { action: intent.getAction(), extras: SCAN_BROADCAST_EXTRAS, rawValue, value })
|
||||
if (!value) { console.warn('[Overseas PDA broadcast] ignored empty value'); return }
|
||||
if (isDuplicateScan(value)) { console.info('[Overseas PDA broadcast] ignored duplicate', { value }); return }
|
||||
onScan(value)
|
||||
@@ -53,23 +65,26 @@ export function startScanBroadcast({ onScan, onError } = {}) {
|
||||
const sdkInt = Number(Build.VERSION.SDK_INT)
|
||||
if (Build.VERSION.SDK_INT >= 33) {
|
||||
const Context = plus.android.importClass('android.content.Context')
|
||||
activity.registerReceiver(receiver, filter, Context.RECEIVER_EXPORTED)
|
||||
registeredActivity.registerReceiver(registeredReceiver, filter, Context.RECEIVER_EXPORTED)
|
||||
} else {
|
||||
activity.registerReceiver(receiver, filter)
|
||||
registeredActivity.registerReceiver(registeredReceiver, filter)
|
||||
}
|
||||
activity = registeredActivity
|
||||
receiver = registeredReceiver
|
||||
let packageName = ''
|
||||
try { packageName = String(activity.getPackageName()) } catch (_) {}
|
||||
try { packageName = String(registeredActivity.getPackageName()) } catch (_) {}
|
||||
console.info('[Overseas PDA broadcast] receiver registered', {
|
||||
action: SCAN_BROADCAST_ACTION,
|
||||
extra: SCAN_BROADCAST_EXTRA,
|
||||
actions: SCAN_BROADCAST_ACTIONS,
|
||||
extras: SCAN_BROADCAST_EXTRAS,
|
||||
packageName,
|
||||
sdkInt,
|
||||
exported: sdkInt >= 33
|
||||
})
|
||||
return () => stopRegisteredBroadcast(registeredActivity, registeredReceiver)
|
||||
} catch (error) {
|
||||
console.error('[Overseas PDA broadcast] registration failed', {
|
||||
action: SCAN_BROADCAST_ACTION,
|
||||
extra: SCAN_BROADCAST_EXTRA,
|
||||
actions: SCAN_BROADCAST_ACTIONS,
|
||||
extras: SCAN_BROADCAST_EXTRAS,
|
||||
message: error?.message || String(error)
|
||||
})
|
||||
receiver = null
|
||||
@@ -81,15 +96,20 @@ export function startScanBroadcast({ onScan, onError } = {}) {
|
||||
return stopScanBroadcast
|
||||
}
|
||||
|
||||
export function stopScanBroadcast() {
|
||||
function stopRegisteredBroadcast(registeredActivity, registeredReceiver) {
|
||||
// #ifdef APP-PLUS
|
||||
if (activity && receiver) {
|
||||
if (registeredActivity && registeredReceiver) {
|
||||
try {
|
||||
activity.unregisterReceiver(receiver)
|
||||
registeredActivity.unregisterReceiver(registeredReceiver)
|
||||
} catch (_) {}
|
||||
}
|
||||
// #endif
|
||||
if (activity !== registeredActivity || receiver !== registeredReceiver) return
|
||||
receiver = null
|
||||
activity = null
|
||||
resetScanDeduplication()
|
||||
}
|
||||
|
||||
export function stopScanBroadcast() {
|
||||
stopRegisteredBroadcast(activity, receiver)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user