You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

新大陆MT90安卓扫码设备多条码扫描数据覆盖问题咨询

问题分析与解决方案

我来帮你搞定这个扫描条码覆盖的问题!

你的核心问题在于:每次点击按钮调用ReadUID或ReadPart时,都新建并注册了一个BroadcastReceiver,但从未注销过。这样一来,当你第二次点击另一个按钮时,系统中会同时存在多个接收器监听nlscan.action.SCANNER_RESULT广播——不管是哪个扫描操作触发的结果,所有接收器都会执行,导致两个TextView的内容被互相覆盖。

下面是修复后的完整方案:


修复步骤与代码示例

1. 定义全局变量

先在Activity类中声明全局的接收器和扫描状态标记,避免重复创建接收器:

private BroadcastReceiver scanReceiver;
private boolean isScanningUid = false; // 标记当前正在扫描的是UID还是Part
private String barcode;
private String barcodePart;

2. 初始化并注册一次接收器

在onCreate方法中完成接收器的初始化和注册,只做一次即可:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.your_layout_id); // 替换为你的布局ID

    // 初始化扫描结果接收器
    scanReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent != null) {
                String scanResult = intent.getStringExtra("SCAN_BARCODE1");
                int barcodeType = intent.getIntExtra("SCAN_BARCODE_TYPE", -1);
                
                if(scanResult != null) {
                    // 根据标记区分扫描类型,将结果写入对应控件
                    if (isScanningUid) {
                        UidBarcode.setText(scanResult);
                        UidBarcodeType.setText(String.valueOf(barcodeType));
                        generateQrCode(String.valueOf(barcodeType), UidImageView);
                    } else {
                        PartBarcode.setText(scanResult);
                        PartBarcodeType.setText(String.valueOf(barcodeType));
                        generateQrCode(String.valueOf(barcodeType), PartImageView);
                    }
                } else {
                    Toast.makeText(getApplicationContext(), "Barcode Not getting.", Toast.LENGTH_LONG).show();
                }
            } else {
                Toast.makeText(getApplicationContext(), "Scan Failed", Toast.LENGTH_LONG).show();
            }
        }
    };

    // 注册接收器
    registerReceiver(scanReceiver, new IntentFilter("nlscan.action.SCANNER_RESULT"));

    // 设置按钮点击事件
    btnScanUid.setOnClickListener(v -> {
        isScanningUid = true;
        triggerScan();
    });

    btnScanPart.setOnClickListener(v -> {
        isScanningUid = false;
        triggerScan();
    });
}

3. 抽离公共方法减少重复代码

把触发扫描和生成二维码的逻辑抽成公共方法,提升代码可维护性:

// 触发扫描的公共方法
private void triggerScan() {
    Intent intent = new Intent("nlscan.action.SCANNER_TRIG");
    intent.putExtra("SCAN_TIMEOUT", 4);
    intent.putExtra("SCAN_TYPE", 1); // 注意:原代码中SCAN_TYPE后面多了个空格,已修正,避免参数不生效
    sendBroadcast(intent);
}

// 生成二维码的公共方法
private void generateQrCode(String text, ImageView targetView) {
    MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
    try {
        BitMatrix bitMatrix = multiFormatWriter.encode(text, BarcodeFormat.QR_CODE, 200, 200);
        BarcodeEncoder barcodeEncoder = new BarcodeEncoder();
        Bitmap bitmap = barcodeEncoder.createBitmap(bitMatrix);
        targetView.setImageBitmap(bitmap);
    } catch (WriterException e) {
        e.printStackTrace();
    }
}

4. 注销接收器避免内存泄漏

在Activity销毁时注销接收器,这是Android开发的最佳实践:

@Override
protected void onDestroy() {
    super.onDestroy();
    if (scanReceiver != null) {
        unregisterReceiver(scanReceiver);
    }
}

修复说明

  1. 单一接收器:全局只注册一个接收器,避免多个接收器同时响应广播导致的覆盖问题
  2. 状态标记:用isScanningUid标记当前扫描类型,确保结果写入正确的控件
  3. 代码复用:抽离公共方法减少重复代码,后续修改逻辑更方便
  4. 内存优化:在onDestroy中注销接收器,避免内存泄漏

内容的提问来源于stack exchange,提问作者Moin Khan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 12:48:15