From f06a4063c9570ddcf5a0f00693950e63ace8d372 Mon Sep 17 00:00:00 2001
From: buhuazhen <hua100783@gmail.com>
Date: 星期二, 03 三月 2026 11:54:04 +0800
Subject: [PATCH] fix(scan): 修复扫码组件重复触发和超时处理问题
---
src/components/scan/index.vue | 96 ++++++++++++++++++++++++++++++++++++++++++-----
1 files changed, 85 insertions(+), 11 deletions(-)
diff --git a/src/components/scan/index.vue b/src/components/scan/index.vue
index 018c202..45dc54b 100644
--- a/src/components/scan/index.vue
+++ b/src/components/scan/index.vue
@@ -4,10 +4,18 @@
</view>
</template>
<script lang="ts" setup>
+declare const plus: any;
+
const main = ref();
const receiver = ref();
const filter = ref();
const codeQueryTag = ref(false);
+const isInitialized = ref(false);
+const isReceiverRegistered = ref(false);
+const scanTimeoutMs = 3500;
+const scanTimeoutTimer = ref<ReturnType<typeof setTimeout> | null>(null);
+const isWaitingScanResult = ref(false);
+const isScanning = ref(false);
const props = defineProps({
emitName: {
type: String,
@@ -15,7 +23,27 @@
},
});
+const clearScanTimeout = () => {
+ if (!scanTimeoutTimer.value) return;
+ clearTimeout(scanTimeoutTimer.value);
+ scanTimeoutTimer.value = null;
+};
+
+const startScanTimeoutWatch = () => {
+ clearScanTimeout();
+ isWaitingScanResult.value = true;
+ scanTimeoutTimer.value = setTimeout(() => {
+ if (!isWaitingScanResult.value) return;
+ console.warn("鎵爜瓒呮椂鏈敹鍒板箍鎾�");
+ isWaitingScanResult.value = false;
+ isScanning.value = false;
+ queryCode("");
+ scanTimeoutTimer.value = null;
+ }, scanTimeoutMs);
+};
+
const initScan = () => {
+ if (isInitialized.value) return;
main.value = plus.android.runtimeMainActivity(); //鑾峰彇activity
let IntentFilter: any = plus.android.importClass("android.content.IntentFilter");
filter.value = new IntentFilter();
@@ -30,36 +58,67 @@
var banMaSacanInfo = intent.getStringExtra(
"com.motorolasolutions.emdk.datawedge.data_string"
);
+ if (!banMaSacanInfo) {
+ banMaSacanInfo =
+ intent.getStringExtra("com.symbol.datawedge.data_string") ||
+ intent.getStringExtra("data");
+ }
// callback(intent.getStringExtra('com.motorolasolutions.emdk.datawedge.data_string'));
console.log("鏂戦┈鎵弿缁撴灉", banMaSacanInfo);
// 浼犲叆鎺ユ敹鍒扮殑鍙傛暟
- queryCode(banMaSacanInfo);
+ isWaitingScanResult.value = false;
+ isScanning.value = false;
+ clearScanTimeout();
+ if (!banMaSacanInfo) {
+ console.warn("鎵弿杩斿洖涓虹┖");
+ }
+ queryCode(banMaSacanInfo || "");
},
});
+ isInitialized.value = true;
};
// 寮�鍚箍鎾�
const startScan = () => {
// #ifdef APP
+ if (!isInitialized.value) {
+ initScan();
+ }
+ if (!main.value || !receiver.value || !filter.value || isReceiverRegistered.value) return;
console.log("startScan,寮�鍚箍鎾帴鏀�");
- main.value.registerReceiver(receiver.value, filter.value);
+ try {
+ main.value.registerReceiver(receiver.value, filter.value);
+ isReceiverRegistered.value = true;
+ } catch (error) {
+ console.error("startScan澶辫触", error);
+ }
// #endif
};
// 鍏抽棴骞挎挱
const stopScan = () => {
// #ifdef APP
+ if (!main.value || !receiver.value || !isReceiverRegistered.value) return;
console.log("stopScan缁撴潫");
- main.value.unregisterReceiver(receiver.value);
+ try {
+ main.value.unregisterReceiver(receiver.value);
+ } catch (error) {
+ console.error("stopScan澶辫触", error);
+ } finally {
+ isReceiverRegistered.value = false;
+ }
// #endif
};
const queryCode = (code: any) => {
// #ifdef APP
- if (codeQueryTag.value) return false;
+ if (codeQueryTag.value) {
+ console.warn("鐭椂闂村唴閲嶅鍥炶皟琚嫤鎴�");
+ return false;
+ }
codeQueryTag.value = true;
setTimeout(function () {
codeQueryTag.value = false;
- }, 150);
+ }, 300);
// console.log('-****--鎵爜code锛� ', code);
let data = code;
uni.$emit(props.emitName, {
@@ -70,14 +129,21 @@
const triggerScan = () => {
console.log("瑙﹀彂鎵弿");
- // 鑾峰彇Android鎰忓浘绫�
- let Intent = plus.android.importClass("android.content.Intent");
- // 瀹炰緥鍖栨剰鍥�
- let intent = new Intent();
- // 瀹氫箟鎰忓浘锛岀敱鍘傚晢鎻愪緵(姝ゅ璁剧疆涓轰笢澶х殑锛� 寮�濮嬫壂鎻忓箍鎾璫om.scan.onStartScan锛屽搴旂殑鍋滄鎵弿骞挎挱涓篶om.scan.onEndScan)
+ if (isScanning.value) {
+ console.warn("宸叉湁鎵弿杩涜涓紝蹇界暐鏈瑙﹀彂");
+ return;
+ }
+ isScanning.value = true;
+
+ if (!main.value) return;
+
+ startScanTimeoutWatch();
+
+ const Intent = plus.android.importClass("android.content.Intent");
+ const intent = new Intent();
intent.setAction("com.symbol.datawedge.api.ACTION");
intent.putExtra("com.symbol.datawedge.api.SOFT_SCAN_TRIGGER", "START_SCANNING");
- // 骞挎挱杩欎釜鎰忓浘
+
main.value.sendBroadcast(intent);
};
@@ -89,11 +155,19 @@
startScan();
});
+onShow(() => {
+ startScan();
+});
+
onHide(() => {
+ isWaitingScanResult.value = false;
+ clearScanTimeout();
stopScan();
});
onUnmounted(() => {
+ isWaitingScanResult.value = false;
+ clearScanTimeout();
stopScan();
});
--
Gitblit v1.9.3