2011-12-17 4 views
3

Я пытаюсь сканировать штрих-код, как показано ниже, используя библиотеку ZXing. Barcode Image http://i.minus.com/ih2b9lavDxOSP.pngZXing: Сканирующий штрих-код с UPC + 5 Дополнительный

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

Любой другой способ получения isbn (0142501158) над штрих-кодами без получения дополнительного штрих-кода +5 (50115) также будет отличным.

Спасибо.

ответ

0

Насколько я знаю, это невозможно с помощью zxing через Intent.

Однако вы можете напрямую вставлять 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); 
} 
+0

Звучит хорошо. Я проверю, работает ли это для моего приложения. Спасибо :) –

+1

Вы можете, безусловно, использовать библиотеку по Intent: http://code.google.com/p/zxing/wiki/ScanningViaIntent. Однако я не думаю, что написал его, чтобы вернуть «сырую» дополнительную информацию, содержащуюся в штрих-коде +5 таким образом. Вам нужно напрямую использовать источник, но 'MultipleBarcodeReader' не будет работать. –

+0

@SeanOwen Не могли бы вы заглянуть в него. Как подготовить пакетный оператор для хранения всего RDD в базе данных. 'http: // stackoverflow.com/ questions/37462803/prepare-batch-statement-to-store-all-the-rdd-to-mysql-generated-from-spark-strea' – Naresh

2

ONE_D_MODE будет работать для вас. Вы, наверное, действительно хотите PRODUCT_MODE. Нет такой вещи, как TWO_D_MODE. Установив это, он просто сканирует все стандартные форматы.

Он не сканирует оба штрих-кода. Это просто сканирование кода продукта. Поэтому я не уверен, что вы имеете в виду только для кода продукта: вот что у вас уже есть. Я предполагаю, что вы хотите того и другого.

MultipleBarcodeReader не совсем подходит для этой ситуации, так как никакая часть библиотеки не сканирует приложение UPC/EAN сама по себе. Он сканируется как расширение только для кодов UPC и EAN.

Он уже сканирует некоторые типы расширений штрих-кода в UPCEANExtensionSupport. Он не возвращает вам исходные значения, а скорее пытается анализировать метаданные и возвращает их в метаданных результата. Если это то, что вы действительно хотите, оно уже делает это. В противном случае вам придется изменить код.

Если он считывает код UPC/EAN, но не может найти код расширения, он не подведет проверку и вернет только первичный код. Если вы хотите, чтобы он возвращался только в том случае, если оба они найдены, вам придется изменить свою копию основной библиотеки.

+0

Не могли бы вы привести пример или ссылку о том, как использовать 'UPCEANExtensionSupport'? Прежде чем отправлять этот вопрос, я искал пример «UPCEANReader», но также не нашел ничего полезного. Очень спасибо за вашу помощь! (Все еще пытаюсь использовать ZXing напрямую ...) –

+0

Вы действительно посмотрели исходный код? Просто найдите обычаи этого класса, это совершенно очевидно. –

+0

Да, но не понимаю, как это работает ... Например, используя 'MultiFormatUPCEANReader' вместо' MultiFormatReader' в 'DecodeHandler'? –

1

FYI вы можете сканировать коды UPC 12 + 5 с помощью Intent/zxing. Единственный улов в том, что вам нужно заставить +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=[[email protected]} 

Возвращаемых значений расширения в моем результате сканирования:

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

Теперь я получил некоторые СКП 12 + 5 :)

Content:079808007955, Format:UPC_A, Extension: 74700