曹睿
2 天以前 aca7aa9ce32acc4c8795342f945b027d3bc9f62a
src/components/scan/index.vue
@@ -3,87 +3,101 @@
    <view class="content"></view>
  </view>
</template>
<!-- 激光扫码,广播模式 -->
<script>
var main, receiver, filter;
var codeQueryTag = false;
export default {
  data() {
    return {
      scanCode: "",
    };
<script lang="ts" setup>
const main = ref();
const receiver = ref();
const filter = ref();
const codeQueryTag = ref(false);
const props = defineProps({
  emitName: {
    type: String,
    default: "scan",
  },
  created() {
    // 初始化
    this.initScan();
    // 启动广播
    this.startScan();
  },
  onHide() {
    // 结束广播
    this.stopScan();
  },
  destroyed() {
    // 结束广播
    this.stopScan();
  },
  methods: {
    // 初始化
    initScan() {
      //  #ifdef APP
      // console.log('initScan:扫码初始化');
      let that = this;
      main = plus.android.runtimeMainActivity(); //获取activity
      //var context = plus.android.importClass('android.content.Context'); //上下文
      var IntentFilter = plus.android.importClass("android.content.IntentFilter");
      filter = new IntentFilter();
      //下面的addAction 改为自己 pad 设备的广播动作(在扫描设置或者厂商附带的app 里面设置为广播模式,然后查看相应参数)
      filter.addAction("com.dwexample.ACTION");
      receiver = plus.android.implements("io.dcloud.feature.internal.reflect.BroadcastReceiver", {
        onReceive: (context, intent) => {
          console.log("---onReceive:", context, intent);
          plus.android.importClass(intent);
          //下面的getStringExtra内改为自己的广播标签(键值/key): data
          //斑马 TC20
          var banMaSacanInfo = intent.getStringExtra(
            "com.motorolasolutions.emdk.datawedge.data_string"
          ); // callback(intent.getStringExtra('com.motorolasolutions.emdk.datawedge.data_string'));
          console.log("斑马扫描结果", banMaSacanInfo);
          // 传入接收到的参数
          that.queryCode(banMaSacanInfo);
        },
      });
      // #endif
});
const initScan = () => {
  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"
      );
      // callback(intent.getStringExtra('com.motorolasolutions.emdk.datawedge.data_string'));
      console.log("斑马扫描结果", banMaSacanInfo);
      // 传入接收到的参数
      queryCode(banMaSacanInfo);
    },
    // 开启广播
    startScan() {
      //  #ifdef APP
      console.log("startScan,开启广播接收");
      main.registerReceiver(receiver, filter);
      // #endif
    },
    // 关闭广播
    stopScan() {
      //  #ifdef APP
      console.log("stopScan结束");
      main.unregisterReceiver(receiver);
      // #endif
    },
    // 避免重复扫码
    queryCode: function (code) {
      //  #ifdef APP
      if (codeQueryTag) return false;
      codeQueryTag = true;
      setTimeout(function () {
        codeQueryTag = false;
      }, 150);
      // console.log('-****--扫码code: ', code);
      let data = code;
      uni.$emit("scan", {
        code: data,
      });
      // #endif
    },
  },
  });
};
// 开启广播
const startScan = () => {
  //  #ifdef APP
  console.log("startScan,开启广播接收");
  main.value.registerReceiver(receiver.value, filter.value);
  // #endif
};
// 关闭广播
const stopScan = () => {
  //  #ifdef APP
  console.log("stopScan结束");
  main.value.unregisterReceiver(receiver.value);
  // #endif
};
const queryCode = (code: any) => {
  //  #ifdef APP
  if (codeQueryTag.value) return false;
  codeQueryTag.value = true;
  setTimeout(function () {
    codeQueryTag.value = false;
  }, 150);
  // console.log('-****--扫码code: ', code);
  let data = code;
  uni.$emit(props.emitName, {
    code: data,
  });
  // #endif
};
const triggerScan = () => {
  console.log("触发扫描");
  // 获取Android意图类
  let Intent = plus.android.importClass("android.content.Intent");
  // 实例化意图
  let intent = new Intent();
  // 定义意图,由厂商提供(此处设置为东大的: 开始扫描广播com.scan.onStartScan,对应的停止扫描广播为com.scan.onEndScan)
  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();
});
onHide(() => {
  stopScan();
});
onUnmounted(() => {
  stopScan();
});
defineExpose({
  triggerScan,
});
</script>