ZXing:使用UPC + 5补充扫描条形码

时间:2011-12-17 11:47:36

标签: android barcode-scanner zxing

我正在尝试使用ZXing库扫描条形码,如下所示。 Barcode Image http://i.minus.com/ih2b9lavDxOSP.png

// 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)的任何其他方式也会很棒。

感谢。

3 个答案:

答案 0 :(得分:2)

ONE_D_MODE将为您效劳。你可能真的想要PRODUCT_MODE。没有TWO_D_MODE之类的东西。通过设置它,它只扫描所有默认格式。

不扫描两个条形码。它只是扫描产品代码。所以我不确定你只想获得产品代码是什么意思:这就是你已经拥有的东西。我想你们两个都想要。

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

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

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

答案 1 :(得分:1)

仅供参考,您可以通过Intent / zxing扫描UPC 12 + 5代码。唯一的问题是你必须强制使用+5,这样你才能扫描正常的条形码。

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

将提示作为额外内容传递给Intent,在IntentIntegrator => initiateScan中(我必须制作一个覆盖方法,以便稍后使用此选项):

// 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

答案 2 :(得分:0)

据我所知,通过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);
}
相关问题