buhuazhen
2026-03-03 f06a4063c9570ddcf5a0f00693950e63ace8d372
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
<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>