Zxing扫描条形码后得到结果前面多了一个0的问题

在集成Zxing的android项目中,遇到扫描UPC-A条形码时结果多出一个0的问题。分析发现,这是由于在未设置DecodeHintType时,UPC-A和EAN-13共用EAN13Reader导致。解决方案是在DecodeThread中通过设置DecodeHintType.POSSIBLE_FORMATS,确保UPCAReader被正确使用,从而避免前缀0的出现。
摘要由CSDN通过智能技术生成

问题描述:

android项目中集成了Zxing扫码功能,一般扫二维码和商品码。正常扫码都没问题,突然有一天反馈说客户扫出来的码不对(附上条码一张),扫描出来结果为“0887229990646”,比条码生成的具体值多了一个0在前面.
在这里插入图片描述

原因分析:

百度上搜寻一番之后都是说码的类型不对导致了自动补齐,找了一个在线生成条码网站试了一下生成其他类型条码都正常,发现是UPC-A的条码扫码后有问题,然后又搜了一下UPC-A相关内容有发现一篇文章中说到

UPC-A条码实际上是EAN-13条码的子集。如果一个EAN-13条码的第一位数字是0,那么这个条码既是EAN-13码也同样是是UPC-A码(去掉开头的0)

应该是条码解析的模式不对然后就去找项目中zxing对应的代码修改就好了。
Zxing代码的详细工作流程就不再重复了可以自行去百度上看一下其他的帖子,最关键的方法就是在DecodeHandler中decode()方法进行扫码解析。

PlanarYUVLuminanceSource source = activity.getCameraManager().buildLuminanceSource(
            rotatedData, width, height);
        if (source != null) {
   
            BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
            try {
   
                // 预览界面最终取到的是个bitmap,然后对其进行解码
                rawResult = multiFormatReader.decodeWithState(bitmap);
            } catch (ReaderException re) {
   
                // continue
            } finally {
   
                multiFormatReader.reset();
            }
        }

可以看到multiFormatReader是控制用什么样的模式来进行解码的,
multiFormatReader是通过DecodeThread中传入的hints进行设置的,

DecodeHandler(ScanActivity activity, Map<DecodeHintType, Object> hints) {
   
        multiFormatReader = new MultiFormatReader();
        multiFormatReader.setHints(hints);
        this.activity = activity;
    }
/**
   * This method adds state to the MultiFormatReader. By setting the hints once, subsequent calls
   * to decodeWithState(image) can reuse the same set of readers without reallocating memory. This
   * is important for performance in continuous scan clients.
   *
   * @param hints The set of hints to use for subsequent calls to decode(image)
   */
  public void setHints(Map<DecodeHintType,?> hints) {
   
    this.hints = hints;

    boolean tryHarder = hints != null && hints.containsKey(DecodeHintType.TRY_HARDER);
    @SuppressWarnings("unchecked")
    Collection<BarcodeFormat> formats =
        hints == null ? null : (Collection<BarcodeFormat>) hints.get(DecodeHintType.POSSIBLE_FORMATS);
    Collection<Reader> readers = new ArrayList<>();
    if (formats != null) {
   
      boolean addOneDReader =
          formats.contains(BarcodeFormat.UPC_A) ||
          formats.contains(BarcodeFormat.UPC_E) ||
          formats.contains(BarcodeFormat.EAN_13) ||
          formats.contains(BarcodeFormat.EAN_8) ||
          formats.contains(BarcodeFormat.CODABAR) ||
          formats.contains(BarcodeFormat.CODE_39) ||
          formats.contains(BarcodeFormat.CODE_93) ||
          formats.contains(BarcodeFormat.CODE_128) ||
          formats.contains(BarcodeFormat.ITF) ||
          formats.contains(BarcodeFormat.RSS_14) ||
          formats.contains(BarcodeFormat.RSS_EXPANDED);
      // Put 1D readers upfront in "normal" mode
      if (addOneDReader && !tryHarder) {
   
        readers.add(new MultiFormatOneDReader(hints));
      }
      if (formats.contains(BarcodeFormat.QR_CODE)) {
   
        readers.add(new QRCodeReader());
      }
      if (formats.contains(BarcodeFormat.DATA_MATRIX)) {
   
        readers.add(new DataMatrixReader());
      }
      if (formats.contains(BarcodeFormat.AZTEC)) {
   
        readers.add(new AztecReader());
      }
      if (formats.contains(BarcodeFormat.PDF_417)) {
   
         readers.add(new 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值