android - 如何在 android 中使用 zxing 库从相机预览中解码条码?

标签 android barcode zxing

我想在我的 android 应用程序中实现独立扫描器。我在我的项目中使用 zxing 的 core.jar 库。

我需要解码来自相机预览的条形码。但我不知道如何实现它。因为没有官方文档。

你能给我一个简单的例子吗? 1.初始化相机并获取预览。 2.解码预览中的条码。

是否有任何示例项目可以执行此操作?

最佳答案

看看我的简单实现: https://github.com/piobab/code-scanner

我使用 ZBar 库,但如果您愿意,可以将 ZBarScannerView.java 实现更改为 ZXingScannerView(其余代码没问题):

public class ZXingScannerView extends ScannerView {
public interface ResultHandler {
    public void handleResult(Result result);
}

private MultiFormatReader mMultiFormatReader;
private ResultHandler mResultHandler;

public ZXingScannerView(Context context) {
    super(context);
    setupScanner(null);
}

public ZXingScannerView(Context context, AttributeSet attributeSet) {
    super(context, attributeSet);
    setupScanner(null);
}

/**
 * Specify recognized codes types.
 * @param codeTypes list of codes types from ZXing library
 */
public void setCodeTypes(List<com.google.zxing.BarcodeFormat> codeTypes) {
    setupScanner(codeTypes);
}

private void setupScanner(List<com.google.zxing.BarcodeFormat> symbols) {
    Map<DecodeHintType,Object> hints = new EnumMap<DecodeHintType,Object>(DecodeHintType.class);
    // Add specific formats
    hints.put(DecodeHintType.POSSIBLE_FORMATS, symbols);
    mMultiFormatReader = new MultiFormatReader();
    mMultiFormatReader.setHints(hints);
}

/**
 * Register callback in order to receive data from scanner.
 * @param resultHandler
 */
public void setResultHandler(ResultHandler resultHandler) {
    mResultHandler = resultHandler;
}

@Override
public void onPreviewFrame(byte[] data, Camera camera) {
    Camera.Parameters parameters = camera.getParameters();
    Camera.Size size = parameters.getPreviewSize();
    int width = size.width;
    int height = size.height;

    Result rawResult = null;
    PlanarYUVLuminanceSource source = buildLuminanceSource(data, width, height);

    if(source != null) {
        BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
        try {
            rawResult = mMultiFormatReader.decodeWithState(bitmap);
        } catch (ReaderException re) {

        } catch (NullPointerException npe) {

        } catch (ArrayIndexOutOfBoundsException aoe) {

        } finally {
            mMultiFormatReader.reset();
        }
    }

    if (rawResult != null) {
        stopCamera();
        if(mResultHandler != null) {
            mResultHandler.handleResult(rawResult);
        }
    } else {
        camera.setOneShotPreviewCallback(this);
    }
}

public PlanarYUVLuminanceSource buildLuminanceSource(byte[] data, int width, int height) {
    Rect rect = getFramingRectInPreview(width, height);
    if (rect == null) {
        return null;
    }
    // Go ahead and assume it's YUV rather than die.
    PlanarYUVLuminanceSource source = null;

    try {
        source = new PlanarYUVLuminanceSource(data, width, height, rect.left, rect.top,
                rect.width(), rect.height(), false);
    } catch(Exception e) {
    }

    return source;
}

如果您使用 gradle,请将“com.google.zxing:core:2.2”添加到您的依赖项中。

关于android - 如何在 android 中使用 zxing 库从相机预览中解码条码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23156399/

相关文章:

android - FileProvider - 从下载目录打开文件

android - Android 应用程序安装在哪里?

java - 在 Java 中使用 Apache Fop 嵌入条形码

ruby-on-rails-3 - 使用 Wicked_PDF (wkhtmltopdf) 在 PDF 中嵌入 SVG

excel - 使用 VBA 从网页复制特定图像并粘贴到 Excel 中

android - ZXING Intent 请求码(识别我的 Intent )

java - 即使图片中存在条形码,也会出现 NotFoundException

android - pendingIntent 中未更新的额外值

java - Android Studio - 意外的顶级异常 QuickBlox 聊天 jar

java - 如何制作一个应用程序,能够从 Android 手机本身的 SD 卡中获取的条形码图像扫描条形码?