【问题标题】:ZXing: Scanning Barcode with UPC + 5 SupplementalZXing:使用UPC+5补充扫描条码
【发布时间】:2019-08-16 01:08:18
【问题描述】:

我正在尝试使用 ZXing 库扫描如下所示的条形码。
(来源:minus.com

// start scanning
Intent intent = new Intent("com.google.zxing.client.android.SCAN");
intent.putExtra("SCAN_MODE", "ONE_D_MODE");
startActivityForResult(intent, REQUEST_CODE);

如果我将"ONE_D_MODE" 替换为"TWO_D_MODE",应用程序可以成功检测到这两个条形码;但result 的值不会改变(仍然是 051488005995)。

// onActivityResult
if(requestCode == REQUEST_CODE && resultCode == RESULT_OK)
    String result = intent.getStringExtra("SCAN_RESULT");

有没有办法同时获取条形码值 051488005995 和 50115?

在不获取补充 +5 条形码 (50115) 的情况下获得条形码上方的 isbn (0142501158) 的任何其他方式也很好。

谢谢。

【问题讨论】:

    标签: android barcode-scanner zxing


    【解决方案1】:

    ONE_D_MODE 将为您工作。你可能真的想要PRODUCT_MODE。没有TWO_D_MODE 这样的东西。通过设置它,它只会扫描所有默认格式。

    它没有扫描两个条码。它只是扫描产品代码。因此,我不确定您仅获取产品代码是什么意思:这就是您已经拥有的。我假设你想要两者。

    MultipleBarcodeReader 不完全适合这种情况,因为库的任何部分都不会自行扫描 UPC/EAN 补充。它仅作为 UPC 和 EAN 代码的扩展进行扫描。

    它已经在UPCEANExtensionSupport 中扫描某些类型的扩展条码。它不会返回原始值,而是尝试解析元数据并在结果元数据中返回。如果那是你真正想要的,它已经做到了。否则你必须修改代码。

    如果它读取 UPC/EAN 码但找不到扩展码,它不会扫描失败,只会返回主码。如果您希望它仅在找到两者时返回,那么您必须再次更改核心库的副本。

    【讨论】:

    • 你能给我一个关于如何使用UPCEANExtensionSupport的例子或链接吗?在发布此问题之前,我一直在寻找 UPCEANReader 示例,但也没有发现任何帮助。真的很感谢你的帮助! (还在尝试如何直接使用ZXing...)
    • 你真的看过源代码吗?随便搜一下这个类的用法,就很明显了。
    • 是的,但还不明白它是如何工作的...例如在DecodeHandler 中使用MultiFormatUPCEANReader 而不是MultiFormatReader
    【解决方案2】:

    据我所知,通过 Intent 使用 zxing 是不可能的。

    但是,您可以直接将 ZXing 嵌入到您的代码中(通过将 ZXing 源代码添加到您的代码目录)。然后您就可以使用com.google.zxing.MultipleBarcodeReader。函数decodeMultiple()返回一个条形码数组,然后可以进一步处理。


    一个小例子:

    // data: YUV camera preview; width/height: preview size
    Result[] decode(byte[] data, int width, int height) {
        PlanarYUVLuminanceSource source = new PlanarYUVLuminanceSource(data, width, height, 0, 0, width, height);
        BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
        MultipleBarcodeReader reader = new MultipleBarcodeReader(new MultiFormatOneDReader(null));
        return reader.decodeMultiple(bitmap);
    }
    

    【讨论】:

    • 您当然可以通过 Intent 使用该库:code.google.com/p/zxing/wiki/ScanningViaIntent。但是我不认为我写它是为了以这种方式返回包含在 +5 条形码中的“原始”补充信息。您确实需要直接使用源,但MultipleBarcodeReader 将不起作用。
    • @SeanOwen 请你调查一下。我如何准备一个批处理语句来将整个 RDD 存储到数据库中。 http://stackoverflow.com/questions/37462803/prepare-batch-statement-to-store-all-the-rdd-to-mysql-generated-from-spark-strea
    【解决方案3】:

    仅供参考,您可以通过 Intent/zxing 扫描 UPC 12+5 代码。唯一的问题是你必须强制 +5,所以你不能扫描普通的条形码。

    来自我与@srowen 的帖子:https://github.com/zxing/zxing/issues/217#issuecomment-54818496

    在 IntentIntegrator=>initiateScan 内部将提示作为额外的 Intent 传递(稍后我必须创建一个覆盖方法以使其成为可选):

    // Force 5 digit extension
    intentScan.putExtra("ALLOWED_EAN_EXTENSIONS", new int[] {5});
    

    我确认它已从我的 Android logcat 中被识别:

    DecodeHintManager﹕ Hints from the Intent: {ALLOWED_EAN_EXTENSIONS=[I@42a38540}
    

    在我的扫描结果中检索到扩展值:

    String extension = intent.getStringExtra("SCAN_RESULT_UPC_EAN_EXTENSION");
    

    现在我得到了一些 UPC 12+5 :)

    Content:079808007955, Format:UPC_A, Extension: 74700
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-05
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多