在没有安装Barcode Scanner应用程序的情况下,嵌入zxing库以提供扫描的首选方法是什么?我希望将它嵌入到android中,而不必提示用户任何额外的安装。 (类似于iPhone src的工作方式)。
答案 0 :(得分:59)
通过Intent进行整合真的更容易。更可靠,您可以自动获得更新。虽然我不建议......
完整的源代码可从ZXing项目获得。您想从core.jar
构建core/
并将其放入Android lib/
文件夹,以在您的应用中包含核心解码器。您不想包含javase
。您可以查看android/
中的代码,因为它是条形码扫描程序的来源,但作为作者,我们建议您不要只复制并粘贴它。
它是Apache licensed,这意味着您可以自由使用它,只要您基本上允许用户访问许可条款。
答案 1 :(得分:29)
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个步骤。
我们可以在命令提示符中使用以下命令将我们拥有的QR码或其他代码图像推送到我们的仿真器上安装的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中的包中。
(注意,右键单击我们项目的包并粘贴......如果要求替换现有文件夹,请选择是)
接下来,将以下代码复制并粘贴到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。
我使用以下网站生成用于测试目的的QR码
谢谢,我想提一下,我只是Android和移动应用程序开发的初学者,对于我可能做过的任何错误感到抱歉......
答案 2 :(得分:4)
如果跟随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();
}
答案 3 :(得分:4)
Now您可以使用official Barcode API from Google:
条形码API可以在设备上以任何方向实时检测条形码。它还可以同时检测多个条形码。
它读取以下条形码格式:
- 1D条码:EAN-13,EAN-8,UPC-A,UPC-E,Code-39,Code-93,Code-128,ITF,Codabar
- 二维条码:二维码,数据矩阵,PDF-417,AZTEC
它会自动解析QR码,数据矩阵,PDF-417和Aztec值,以支持以下格式:
- URL
- 联系信息(VCARD等)
- 日历活动
- 电子邮件
- 电话
- SMS
- ISBN
- 无线网络
- 地理位置(经度和纬度)
- AAMVA驾驶执照/ ID
答案 4 :(得分:2)
我自己尝试过这种方法,其中大部分似乎都有用。
虽然我有几点要做
它会抱怨com.google.zxing.client.androidtest软件包,它是在软件包中找到并在QRDecoder Activity中使用的RGBLuminanceSource类所必需的。 导入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接口将QRCode推送到设备SDCard。
答案 5 :(得分:0)
https://github.com/dm77/barcodescanner
我比Google Play服务更喜欢这个lib,因为像往常一样,谷歌 Play服务需要在设备上安装相同的版本。
它将Zxing与新的构建系统嵌入并提供了一个aar。真的很酷。
答案 6 :(得分:-1)
我试图嵌入 ZXing (XZing)一段时间,直到我发现了Zbar。他们有一种更简单的嵌入方式,更少的代码和简单的示例。