在安卓应用中嵌入 ZXing

Posted

技术标签:

【中文标题】在安卓应用中嵌入 ZXing【英文标题】:Embedding ZXing in android app 【发布时间】:2011-08-23 14:29:31 【问题描述】:

所以我是另一个不幸的 android 开发初学者,需要在他的应用程序中嵌入 ZXing 条码扫描器。

在 *** 上有很多问题询问如何在此处执行此操作,但没有一个问题的答案对于初学者来说是真正可以理解和解释的。所有的答案都说“你所要做的就是构建 ZXing 项目的核心库,在你的项目中引用它,然后将 ZXing 的 android/目录中的一些代码复制到你的应用程序中,你就完成了”。但这对菜鸟来说不是很有帮助。

我的项目中引用了 ZXings 核心库。我打开了 Barcode Scanner 应用程序源。我正在尝试阅读和理解 Barcode Scanner 应用程序的代码,但对于我的知识水平来说它太复杂了。

我只想在我的应用程序中有一个按钮,当按下该按钮时,它会打开条形码扫描仪,扫描仪应该只能扫描条形码,对其进行解码并将数字返回给我,它不需要发送在任何地方编写代码以获取任何信息等,我自己会处理这些事情。我只需要一个简单的扫描仪,它会在单击按钮时启动,扫描代码并给我结果。但我不知道自己该怎么做。 如果您只需要从 ZXing 扫描仪中复制一些文本,我认为这应该不难做到,您只需要了解它的代码即可。

因此,如果有人可以解释这一点(告诉要复制哪些代码部分,如何在按钮 onClick 方法中启动扫描仪等),请这样做,我相信有很多人会对此表示感谢我会的。

【问题讨论】:

您是否有充分的理由不只是通过 BarcodeScanner 应用程序的意图来执行此操作? 是的,我肯定会使用意图来做这件事,但这不取决于我。 有足够的理由不使用 Intents 吗? 我不确定,但这并不重要,我必须在应用程序中嵌入扫描仪:) 我也会使用 Intent,但是,一个原因可能是用户需要安装 ZXing 应用程序,如果它是嵌入式的,他不需要。 【参考方案1】:

我必须完全按照您的要求去做。这并不容易,但也不算太糟糕。这也是我的第一个(商业或其他)Android 应用程序。 我所做的是:

获取ZXing工程编译 并在您的机器上运行。那里 是一个关于如何做到这一点的好教程here。

修改此代码以满足您的需要。我将很多项目剥离为基本的扫描仪。然后我围绕它构建了我的项目的其余部分。以下是如何做到这一点。

使核心中的 CaptureActivity 尽可能简单。您所需要的只是从核心扫描仪代码返回的数字。这是我的项目结构的图片:

您会发现,您需要修改 4 个文件才能使修改后的 Activity 类正常工作。这些文件是 CameraCaptureActivity 类、CaptureActivityHandler 类以及解码线程和解码处理程序类。我已经托管了这些文件here。

将这四个文件放入您的 ZXing 工作项目的副本中。删除原来的 CaptureActivity 以及您已替换的其他原始线程和处理程序类。 (忽略 CaptureActivityHandlerDemo 文件,因为它是错误放在那里的)

更改包名称以匹配工作的 ZXing 包名称。确保您的活动在所有这四个类中的名称相同。传入实现“getHolder”而不是 Activity 类本身的接口可能是个好主意。

确保您已更新您的清单,并对您的活动名称进行任何更改。确保您有一种导航到 Activity 的方法 - 或许将其设为 Intent 过滤器区域中的默认类。

我还为您的 Activity 包含了一个布局文件 - 它非常简单,但是您只需启动扫描仪并使其正常工作。它被称为 camera_capture.xml

希望这就是您启动和运行所需的全部内容。这不是一个简单的过程,很遗憾我不能给你我的整个项目,因为它是一个商业产品。

祝你好运!!

PS 请在此答案上以 cmets 的形式发布任何问题,我会尽力提供帮助。

【讨论】:

非常感谢 CaspNZ,您的回答真的很有帮助,我想我几乎成功了,但我仍然遇到了一些问题。我复制了您的精简类、更正的包名和清单文件。我还更改了 CameraCaptureActivity 以扩展 Activity 而不是 Rotateable 活动,并使其不实现 IParentActivity,因为我无法在任何地方找到这些类。现在,当我从我的应用程序主活动启动 captureactivity 时,扫描仪会显示在屏幕上,但我什么也不做,我只看到相机视图,但它不扫描代码。 好的,这里有几种可能性 - 1,扫描仪没有被初始化(确保这发生在你的 onCreate 方法和你的 onResume 方法中),2,一些回调失败原因和 3 存在阻止回调发生的错误或代码更改。 检查 Handler 或 Thread 类以确保正在扫描所有代码类型。我想我禁用了除 QR 码以外的所有代码。在处理程序和线程类上放置一些断点以查看代码是否到达那里。让我知道这是否有帮助。 哦,抱歉,可旋转活动和接口 - 我忘了删除它们... 有效!它从一开始就有效,只是我没有在handleDecode方法中处理解码,所以没有哔哔声或任何其他迹象表明条形码已被扫描,所以我认为它根本不扫描条形码,愚蠢的我:D非常感谢CaspNZ,非常感谢您的帮助。【参考方案2】:

我对 Barcode Scanner 进行了 fork 并将其转换为一个库项目,并删除了您仅通过 IntentIntegrator 扫描条形码时不需要的大部分功能。

带有说明的项目可在https://github.com/embarkmobile/zxing-android-minimal获得。

如果您已经在使用 Maven,将它包含在您的项目中真的很容易。如果没有 - 您可以使用 CaspNZ 描述的方法将代码复制到您的项目中。

【讨论】:

以上是关于在安卓应用中嵌入 ZXing的主要内容,如果未能解决你的问题,请参考以下文章

开发苹果应用能像安卓那样把一个手机html5版嵌入应用外壳作成应用吗?

安卓开发中使用ZXing生成解析二维码

本人现在开发一款android应用要app,想请教业内人士,在安卓app中怎样嵌入支付宝、微信支付

安卓调用zxing扫码之后返回结果为空

如何看待安卓未来的发展

安卓的Socket客户端开发及应用