我正在尝试使用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)的任何其他方式也会很棒。
感谢。
答案 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);
}