新大陆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); } }
修复说明
- 单一接收器:全局只注册一个接收器,避免多个接收器同时响应广播导致的覆盖问题
- 状态标记:用
isScanningUid标记当前扫描类型,确保结果写入正确的控件 - 代码复用:抽离公共方法减少重复代码,后续修改逻辑更方便
- 内存优化:在
onDestroy中注销接收器,避免内存泄漏
内容的提问来源于stack exchange,提问作者Moin Khan
相关产品推荐
相关产品推荐

