安卓二维码扫描库

41

有没有可以用于QR数据发现和从图像中提取的工具可供我们使用(如果有)?

迄今为止,虽然已经有很多帖子提到了ZXing库进行QRCode扫描,但我发现那对我来说并不是一个有效的解决方案。其他几个人一直在寻找QRCode扫描的替代方案,但我没有看到有用的反馈。我想再次向社区询问,除了启动活动并调用自己应用程序之外,还有哪些QR代码库选项可以扫描来自Camera2 API的图像。它应该采用非常简单的方式进行扫描。它不应该是一个复杂的库。我没有看到过这种方法的示例或个人讲解。

实际上,我感到困惑的是,为什么还没有将QRCode功能的原生实现添加到相机库或Google SDK内部的类似位置中,直接嵌入操作系统呢?

调用和需要另一个应用程序(甚至请求下载)并不是一种优雅的解决方案,没有用户应该陷入这样的境地。作为开发人员,我们应该有权利访问一个能够从图像或帧中提取QRCode的库,并能够删除编码数据。


2
您可以轻松地将zxing库添加到您的应用程序中,并创建自定义视图来处理相机视图,然后将该信息传递给zxing库而不打开任何其他应用程序。 - Aegis
2
这是我的解释,为什么在我在谷歌的时候它从未被集成到Android中:http://www.quora.com/QR-Codes/Why-havent-Google-or-Apple-embedded-a-QR-reader-in-their-Camera-apps - Sean Owen
6个回答

16

虽然Sean Owen和其他人对原始Zxing库进行了几年的条形码库处理方法探索,但Google终于发布了官方版本的Google Play服务,用于处理QR码和条形码。

这里介绍了条形码检测库。包含这些库将使集成变得更加顺畅。我会在稍后的时间内发布一些样例代码,以便从捕获的图像中实现这些结果。此时,我想更新我的答案,以反映此官方发布事件。如果这确实提供了一种良好的获取信息的方式(无需跳过麻烦和复杂性),那么我将更新源代码并标记为已接受的答案。

Google在过去一年提供的检测库要容易使用得多。它允许快速集成相机API,并简单地提取信息。这将是我建议前进识别的组件。下面演示了一个处理QR码的快速片段,其中还保留了一些伪代码。

public final void analyzeFrameForQrCode(byte[] qrCodePictureF, int imageFormatF, XriteSize previewWindowSizeF)
{
    if(!qrCodeDetectionPossible() || qrCodePictureF == null || mIsAnalyzingQrCodeFrame)
    {
        return;
    }

    ... //Bitmap conversion code

    Frame frame = new Frame.Builder().setBitmap(pictureTaken).build();
    SparseArray<Barcode> barcodes = mBarcodeDetector.detect(frame);
    if(barcodes != null && barcodes.size() != 0)
    {
        Barcode qrCode = barcodes.valueAt(0);//barcodes.get(Barcode.QR_CODE);
        if(qrCode != null)
        {
             if(extractInformationFromQrCode(qrCode.rawValue)) {
                    mIsRequestingBarcodeDetection = false;
                    vibrateForQrCodeDiscovery();
                    ((Activity)mContext).runOnUiThread(new Runnable() {
                        @Override
                        public void run()
                        {
                            hideBarcodeDetection(true);
                        }
                    });
                }
            }
        }

     ... //Cleanup and code beyond Qr related material

   } 
}

当然还有其他可供利用的调用。但实际上只有几行代码。使用该库进行帧分析的服务不会默认出现在设备上。因此,在计算之前,您应该检查该库是否可用(例如,当无法连接到互联网时)。这是它的一个小烦恼。我曾经以为随着支持库或Google服务更新到所有设备上,它会作为更新的一部分。但是它需要先与外部服务通信才能使用这些库调用。一旦设备完成了一次通信,那么从那一刻起它就很好用了。

在我的小例子中,我在检查后弹出一个toast,然后退出活动,让用户检查他们的连接。这也可以通过一小段示例代码来完成。

if(!mBarcodeDetector.isOperational())
{
    updateUserInstructions("The barcode library cannot be downloaded");
    return false;
}

编辑(更新):

自使用最新的Google Play Services Vision库进行条形码检测以来已经过了相当长的时间。虽然需要通过wifi下载库是一个限制,但这只需要一次。而且,让我们诚实地说...

...我们的设备将拥有连接。该库是在后台下载的,因此您甚至不会注意到它正在发生,除非下载时出现问题,那么您就必须报告适当的纠正措施,例如为其启用Internet连接。

另外一个小提示是,有时集成库到应用程序中可能会有些棘手。将其作为库项目使用在某些设备上可以工作,但在其他设备上失败了。将jar添加到构建路径可在更多设备上解决问题(也可能是全部设备)。因此,目前在包含它在您的项目中时,我建议使用第二种方法。


5
它需要先与外部服务进行通信才能使用这些库调用,所以情况非常糟糕。 - fralbo
理想情况下,该库不需要这个。我同意这可以在没有它的情况下完成。也许在将来,他们会将其纳入其支持库中,以便我们可以打包它并不依赖外部组件。与Zxing库相比,这个库更加清洁,并且在集成时运行顺畅。 - Jay Snayder
1
实际上,我刚刚在这里找到了我期望的 Zxing 实现(https://github.com/dm77/barcodescanner)。棒极了! - fralbo

9

6
您也可以查看 MobileVisionBarcodeScanner (请注意我是此软件包的作者)。它由谷歌的移动视觉 API 提供支持。另请参阅这里 的概述。

5

4

我想你已经找到了你要找的库。请查看core/模块:

https://github.com/zxing/zxing/tree/master/core

您只是在查看基于Intent的集成,但实际上核心扫描是自己独立的库,您可以将其嵌入到自己的应用程序中。
我认为大多数情况下基于Intent的集成是最好的选择,因为它非常简单,大多数人没有时间在核心之上重新实现自己的扫描UI等。大多数设备已经安装了条形码扫描器,所以通常不需要下载。
不过,取决于您的选择。这就是为什么至少有两种使用方法的原因。

2
在花费一些时间进行分析和试验后,我成功地通过调整QRCodeReader类并传入自己的位图获得了一些结果,但我不得不使用其他类(如BinaryBitmap和Binarizer类)进行手动转换。它似乎不像一个库,而更像一组类。 - Jay Snayder
我期望看到某种类,它返回QRCodeReader的Result信息,并且在Reader构造期间可以传递Bitmap作为参数的选项。也许会返回一个QRResult字段,其中包含信息。到目前为止,这不是我所期望的,但是我已经成功地使用了该库进行读取,因此它对我有用。 - Jay Snayder
不确定您所指的是什么,但这里有一个Android中整个过程的示例:https://code.google.com/p/zxing/source/browse/trunk/android/src/com/google/zxing/client/android/DecodeHandler.java#77和JavaSE中的示例:https://code.google.com/p/zxing/source/browse/trunk/javase/src/main/java/com/google/zxing/client/j2se/DecodeWorker.java#144。核心代码只有几行,从特定于平台的表示到`BinaryBitmap`再到库调用。第二条评论似乎想要:https://code.google.com/p/zxing/source/browse/trunk/core/src/main/java/com/google/zxing/qrcode/QRCodeReader.java#63 - Sean Owen
最好找另一种替代方案。它的效果不是很好。 - Boris Karloff

-6
不必集成QRCODE ZXing库,您可以在任何地方打开相机并扫描QRCode: 我找到的以下代码可能会有助于您扫描QRCode:
try {
                Intent intent = new Intent("com.google.zxing.client.android.SCAN");
                intent.putExtra("SCAN_MODE", "QR_CODE_MODE"); // "PRODUCT_MODE for bar codes
                startActivityForResult(intent, 0);
            } catch (Exception e) {    
                Uri marketUri = Uri.parse("market://details?id=com.google.zxing.client.android");
                Intent marketIntent = new Intent(Intent.ACTION_VIEW,marketUri);
                startActivity(marketIntent);
            }

请记住,您必须在手机上安装“Zxing”条形码扫描应用程序,否则它将首先重定向到Google Play商店链接以下载它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接