<template>
|
<view>
|
<view class="content"></view>
|
</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,
|
default: "scan",
|
},
|
});
|
|
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();
|
//下面的addAction 改为自己 pad 设备的广播动作(在扫描设置或者厂商附带的app 里面设置为广播模式,然后查看相应参数)
|
filter.value.addAction("com.dwexample.ACTION");
|
receiver.value = plus.android.implements("io.dcloud.feature.internal.reflect.BroadcastReceiver", {
|
onReceive: (context: any, intent: any) => {
|
console.log("---onReceive:", context, intent);
|
plus.android.importClass(intent);
|
//下面的getStringExtra内改为自己的广播标签(键值/key): data
|
//斑马 TC20
|
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);
|
// 传入接收到的参数
|
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,开启广播接收");
|
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结束");
|
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) {
|
console.warn("短时间内重复回调被拦截");
|
return false;
|
}
|
codeQueryTag.value = true;
|
setTimeout(function () {
|
codeQueryTag.value = false;
|
}, 300);
|
// console.log('-****--扫码code: ', code);
|
let data = code;
|
uni.$emit(props.emitName, {
|
code: data,
|
});
|
// #endif
|
};
|
|
const triggerScan = () => {
|
console.log("触发扫描");
|
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);
|
};
|
|
onLoad(() => {
|
console.log("初始化");
|
// 初始化
|
initScan();
|
// 启动广播
|
startScan();
|
});
|
|
onShow(() => {
|
startScan();
|
});
|
|
onHide(() => {
|
isWaitingScanResult.value = false;
|
clearScanTimeout();
|
stopScan();
|
});
|
|
onUnmounted(() => {
|
isWaitingScanResult.value = false;
|
clearScanTimeout();
|
stopScan();
|
});
|
|
defineExpose({
|
triggerScan,
|
});
|
</script>
|