spring
5 天以前 2f26ba8f2c8f5c67e5ed16f4e89baaef82d70a3b
components/scan/scan.vue
@@ -1,93 +1,167 @@
<template>
   <view>
      <view class="content">
         <!-- <text>扫描结果:{{ scanResult }}</text> -->
      </view>
   </view>
</template>
<script>
   var main, receiver, filter;
   var action, extraKey;
   var _codeQueryTag = false;
   export default {
      data() {
         return {
            scanCode: ''
         }
      },
      created: function(option) {
         uni.getSystemInfo({
            success: (res) => {
               var brand = res.brand.toUpperCase();
               var model = res.model.toUpperCase();
               if (brand.indexOf("ZEBRA")!=-1 && model.indexOf("TC2")!=-1) {
                   action = "com.zebra.scan";
                   extraKey = "com.motorolasolutions.emdk.datawedge.data_string";
               } else if (brand.indexOf("SEUIC")!=-1||brand.indexOf("AUTOID")!=-1) {
                   action = "com.android.server.scannerservice.broadcast";
                   extraKey = "scannerdata";
               }else{
                  return;
               }
               console.log(action);
               console.log(extraKey);
               this.initScan()
               this.startScan();
var main, receiver, filter;
var action, extraKey;
var _codeQueryTag = false;
export default {
   data() {
      return {
         scanCode: '',
         scanResult: ''
      }
   },
   created() {
      uni.getSystemInfo({
         success: (res) => {
            var brand = res.brand.toUpperCase();
            var model = res.model.toUpperCase();
            console.log('设备品牌:', brand);
            console.log('设备型号:', model);
            // Zebra设备配置
            if (brand.indexOf("ZEBRA") != -1 && model.indexOf("TC2") != -1) {
               action = "com.zebra.scan";
               extraKey = "com.motorolasolutions.emdk.datawedge.data_string";
            }
         })
            // AUTOID9N设备配置
            else if (brand.indexOf("SEUIC") != -1 || brand.indexOf("AUTOID") != -1) {
               // AUTOID9N专用配置
               if (model.indexOf("AUTOID9N") != -1) {
                  action = "com.android.server.scannerservice.broadcast";
                  extraKey = "scannerdata"; // 或 "BARCODE_STRING",根据实际情况调整
               }
               // 其他SEUIC设备
               else {
                  action = "com.android.server.scannerservice.broadcast";
                  extraKey = "scannerdata";
               }
            }
            else {
               console.log('未知设备品牌,无法初始化扫码');
               return;
            }
            console.log('扫码广播配置:', { action, extraKey });
            this.initScan();
            this.startScan();
         },
         fail: (err) => {
            console.error('获取系统信息失败:', err);
         }
      });
   },
   onLoad() {
      // 监听全局扫码事件
      uni.$on('scan', (event) => {
         this.scanResult = event.code;
         console.log('扫码结果:', this.scanResult);
      });
   },
   onUnload() {
      this.stopScan();
      uni.$off('scan'); // 移除事件监听
   },
   methods: {
      initScan() {
         console.log('初始化扫码接收器');
      },
      onHide: function() {
         this.stopScan();
      },
      destroyed: function() {
         this.stopScan();
      },
      methods: {
         initScan() {
            console.log('initScan');
            let _this = this;
            main = plus.android.runtimeMainActivity(); //获取activity
         try {
            main = plus.android.runtimeMainActivity(); // 获取activity
            var IntentFilter = plus.android.importClass('android.content.IntentFilter');
            filter = new IntentFilter();
            //下面的addAction内改为自己的广播动作
            filter.addAction(action);
            console.log('注册广播过滤器:', action);
            receiver = plus.android.implements('io.dcloud.feature.internal.reflect.BroadcastReceiver', {
               onReceive: function(context, intent) {
                  console.log('onReceive');
                  plus.android.importClass(intent);
                  //下面的getStringExtra内改为自己的广播标签--有误
                  let code = intent.getStringExtra(extraKey);
                  _this.queryCode(code);
               }
               onReceive: function (context, intent) {
                  console.log('接收到扫码广播');
                  try {
                     plus.android.importClass(intent);
                     let code = intent.getStringExtra(extraKey);
                     if (code) {
                        console.log('扫码内容:', code);
                        this.queryCode(code);
                     } else {
                        console.warn('扫码内容为空,可能ExtraKey不正确:', extraKey);
                        // 尝试备选ExtraKey
                        const altExtraKey = extraKey === "BARCODE_STRING" ? "scannerdata" : "BARCODE_STRING";
                        code = intent.getStringExtra(altExtraKey);
                        if (code) {
                           console.log('使用备选ExtraKey获取到内容:', altExtraKey);
                           this.queryCode(code);
                        }
                     }
                  } catch (e) {
                     console.error('处理扫码广播时出错:', e);
                  }
               }.bind(this) // 确保this指向组件实例
            });
         },
         startScan() {
            console.log('startScan');
            main.registerReceiver(receiver, filter);
         },
         stopScan() {
            console.log('stopScan');
            main.unregisterReceiver(receiver);
         },
         queryCode: function(code) {
            console.log('queryCode');
            if (_codeQueryTag) return false;
            _codeQueryTag = true;
            setTimeout(function() {
               _codeQueryTag = false;
            }, 150);
            var id = code
            uni.$emit('scan', {
               code: id
            })
            console.log('扫码接收器初始化成功');
         } catch (e) {
            console.error('初始化扫码接收器失败:', e);
         }
      },
      startScan() {
         console.log('开始监听扫码广播');
         try {
            if (main && receiver && filter) {
               main.registerReceiver(receiver, filter);
               console.log('广播接收器已注册');
            } else {
               console.error('无法注册广播接收器: 组件未初始化');
            }
         } catch (e) {
            console.error('注册广播接收器失败:', e);
         }
      },
      stopScan() {
         console.log('停止监听扫码广播');
         try {
            if (main && receiver) {
               main.unregisterReceiver(receiver);
               console.log('广播接收器已注销');
            }
         } catch (e) {
            console.error('注销广播接收器失败:', e);
         }
      },
      queryCode(code) {
         console.log('处理扫码结果:', code);
         if (_codeQueryTag) {
            console.log('忽略重复扫码');
            return false;
         }
         _codeQueryTag = true;
         // 防抖处理
         setTimeout(() => {
            _codeQueryTag = false;
         }, 150);
         // 触发全局事件
         uni.$emit('scan', { code });
      }
   }
}
</script>
<style>
</style>
<style></style>