在不安装 Barcode Scanner 应用程序的情况下嵌入 zxing 库以提供扫描的首选方式是什么?我希望将它嵌入到 android 中,而不必提示用户进行任何额外的安装。(类似于 iPhone src 的工作方式)。
7 回答
Android QR/条形码/多格式解码器。
我使用 ZXing API 制作了一个 Android 应用程序,并且只将解码代码嵌入到我的应用程序中。该解码器的输入是通过 Android 模拟器的 SD 卡提供的。
以下是步骤:
首先,我在我的 Eclipse IDE 中创建了一个 AVD(模拟器)版本 4,并打开了 SD 卡和相机功能。
接下来,我在命令提示符下使用以下命令创建了一个 SDCard:
c:\>mksdcard 40M mysdcard.iso
其中 40M 是我创建的 SD 卡的大小。这将保存在 C: 驱动器中。请注意,.iso 部分很重要。
接下来,我们必须在命令提示符下使用以下命令将 SD 卡安装到模拟器中:
c:\>emulator -sdcard "c:\mysdcard.iso" @myavd4
这里 myavd4 是我在步骤 1 中创建的模拟器/android 虚拟设备的名称。avd 名称前的“@”符号也很重要。
保持模拟器一直运行。如果它关闭,我们必须重做上述3个步骤。
我们可以通过在命令提示符下使用以下命令将我们拥有的二维码或其他代码图像推送到安装在我们模拟器上的这个 SD 卡上:
c:\>adb push "c:\myqrcode.png" /sdcard
接下来,在 Eclipse IDE 中,启动一个新的 android 项目。下面的代码应该粘贴在我们项目的 QRDecoder.java 文件中。
package com.example.palani; import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.TextView; import com.google.zxing.BarcodeFormat; import com.google.zxing.BinaryBitmap; import com.google.zxing.ChecksumException; import com.google.zxing.FormatException; import com.google.zxing.LuminanceSource; import com.google.zxing.MultiFormatReader; import com.google.zxing.NotFoundException; import com.google.zxing.Reader; import com.google.zxing.Result; import com.google.zxing.ResultPoint; import com.google.zxing.client.androidtest.RGBLuminanceSource; import com.google.zxing.common.HybridBinarizer; public class QRDecoder extends Activity implements OnClickListener { public static class Global { public static String text=null; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Bitmap bMap = BitmapFactory.decodeFile("/sdcard/myqrcode.png"); TextView textv = (TextView) findViewById(R.id.mytext); View webbutton=findViewById(R.id.webbutton); LuminanceSource source = new RGBLuminanceSource(bMap); BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source)); Reader reader = new MultiFormatReader(); try { Result result = reader.decode(bitmap); Global.text = result.getText(); byte[] rawBytes = result.getRawBytes(); BarcodeFormat format = result.getBarcodeFormat(); ResultPoint[] points = result.getResultPoints(); textv.setText(Global.text); webbutton.setOnClickListener(this); } catch (NotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ChecksumException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (FormatException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public void onClick(View v) { Uri uri = Uri.parse(Global.text); Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent); } }
接下来我从下面的链接下载了 ZXing 源代码(ZXing-1.6.zip)。
http://code.google.com/p/zxing/downloads/list
然后,解压并导航到 D:\zxing-1.6\core\src\com
复制 com 文件夹并将其粘贴到我们在 Eclipse 中的包中。
(注意,右键点击我们项目的包并粘贴...如果要求替换现有文件夹,请选择yes)
接下来,将以下代码复制并粘贴到 res/layout/main.xml 文件中
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:padding="20dip" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:textColor="@color/mbackground1" android:gravity="center_horizontal" android:text="@string/decode_label" android:padding="20dip" /> <TextView android:id="@+id/mytext" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center_horizontal" android:background="@color/mbackground2" android:textColor="@color/mytextcolor" android:padding="20dip" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/continue_label" android:gravity="center_horizontal" android:textColor="@color/mytextcolor" android:padding="20dip" /> <Button android:id="@+id/webbutton" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/web_button" android:textColor="@color/mytextcolor" /> </LinearLayout>
接下来,将以下代码复制并粘贴到 res/values/strings.xml 文件中
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello World, QRDecoder!</string> <string name="app_name">QRDecoder</string> <string name="continue_label">Click below to load the URL!!</string> <string name="web_button">Load the URL!!</string> <string name="decode_label">Decoded URL</string> </resources>
接下来,将以下代码复制并粘贴到 res/values/color.xml 文件中,如果不存在,则创建一个。
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="mbackground1">#7cfc00</color> <color name="mbackground2">#ffff00</color> <color name="mytextcolor">#d2691e</color> </resources>
接下来,将以下代码复制并粘贴到清单文件中的开始标记之后
<manifest> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
所以,上述这些步骤完成了......我们的应用程序已经准备好了。现在,您可以运行应用程序,它将为您提供我们给出的输入图像的解码结果。
要更改输入,请在命令提示符下使用以下命令将另一个文件推送到 SD 卡
c:\>adb push "c:\image2.png" /sdcard
并更改我们的 QRDecoder.java 中的输入以反映相同
Bitmap bMap = BitmapFactory.decodeFile("/sdcard/image.png");
输入可以是任何格式,如 QRCode、条形码等。图像类型可以是 bmp、jpg 或 png。
我使用以下网站生成二维码以进行测试
谢谢,我想提一点,我只是 android 和移动应用程序开发的初学者,对于我可能犯的任何错误,我深表歉意......
如果按照 Palani 的回答,只想导入 zxing 核心。这是在不导入 zxing.androidtest 的情况下使用 RGBLuminanceSource 的方法。
// import com.google.zxing.client.androidtest.RGBLuminanceSource;
import com.google.zxing.RGBLuminanceSource;
// Bitmap mBitmap; // some bitmap...
int width = mBitmap.getWidth();
int height = mBitmap.getHeight();
int[] pixels = new int[width * height];
mBitmap.getPixels(pixels, 0, width, 0, 0, width, height);
RGBLuminanceSource source = new RGBLuminanceSource(width, height, pixels);
BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(source));
try {
Result result = zxingReader.decode(binaryBitmap);
} catch (Exception e) {
e.printStackTrace();
}
现在您可以使用Google 的官方 Barcode API:
Barcode API 在设备上以任何方向实时检测条形码。它还可以一次检测多个条码。
它读取以下条形码格式:
- 一维条码:EAN-13、EAN-8、UPC-A、UPC-E、Code-39、Code-93、Code-128、ITF、Codabar
- 二维条码:QR Code、Data Matrix、PDF-417、AZTEC
它会自动解析 QR 码、数据矩阵、PDF-417 和 Aztec 值,支持以下格式:
- 网址
- 联系方式(VCARD 等)
- 日历事件
- 电子邮件
- 电话
- 短信
- 国际标准书号
- 无线上网
- 地理位置(纬度和经度)
- AAMVA 驾驶执照/身份证
我自己尝试过这种方法,最重要的是似乎有效。
虽然我有几点要说
它将抱怨包 com.google.zxing.client.androidtest 包中的 RGBLuminanceSource 类需要它并在 QRDecoder Activity 中使用。所以也导入 zxing/androidtest 包。
如果您在包外添加 Zxing 库,那么您将需要编辑所有 R.java 引用,因为它不会在其包中找到 R.java 文件。
例如:
代替
mRunBenchmarkButton = (Button) findViewById(R.id.benchmark_run);
在 BenchmarkActivity.java 文件中使用
mRunBenchmarkButton = (Button) findViewById(yourpackage.R.id.benchmark_run);
我们也可以使用 Eclipse 的 DDMS 接口将二维码推送到设备 SDCard。
https://github.com/dm77/barcodescanner
我更喜欢这个库而不是 Google Play 服务,因为像往常一样,Google Play 服务需要在设备上安装相同的版本。
它将 Zxing 嵌入到新的构建系统中,并提供了一个 aar。真的很酷。
我尝试嵌入ZXing(XZing)一段时间,直到我发现了Zbar。它们具有更简单的嵌入方式、更少的代码和简单的示例。