虽然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;
}
...
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);
if(qrCode != null)
{
if(extractInformationFromQrCode(qrCode.rawValue)) {
mIsRequestingBarcodeDetection = false;
vibrateForQrCodeDiscovery();
((Activity)mContext).runOnUiThread(new Runnable() {
@Override
public void run()
{
hideBarcodeDetection(true);
}
});
}
}
}
...
}
}
当然还有其他可供利用的调用。但实际上只有几行代码。使用该库进行帧分析的服务不会默认出现在设备上。因此,在计算之前,您应该检查该库是否可用(例如,当无法连接到互联网时)。这是它的一个小烦恼。我曾经以为随着支持库或Google服务更新到所有设备上,它会作为更新的一部分。但是它需要先与外部服务通信才能使用这些库调用。一旦设备完成了一次通信,那么从那一刻起它就很好用了。
在我的小例子中,我在检查后弹出一个toast,然后退出活动,让用户检查他们的连接。这也可以通过一小段示例代码来完成。
if(!mBarcodeDetector.isOperational())
{
updateUserInstructions("The barcode library cannot be downloaded");
return false;
}
编辑(更新):
自使用最新的Google Play Services Vision库进行条形码检测以来已经过了相当长的时间。虽然需要通过wifi下载库是一个限制,但这只需要一次。而且,让我们诚实地说...
...我们的设备将拥有连接。该库是在后台下载的,因此您甚至不会注意到它正在发生,除非下载时出现问题,那么您就必须报告适当的纠正措施,例如为其启用Internet连接。
另外一个小提示是,有时集成库到应用程序中可能会有些棘手。将其作为库项目使用在某些设备上可以工作,但在其他设备上失败了。将jar添加到构建路径可在更多设备上解决问题(也可能是全部设备)。因此,目前在包含它在您的项目中时,我建议使用第二种方法。