embeddedZxing库而不使用条码扫描器应用程序
在没有安装Barcode Scanner应用程序的情况下embeddedzxing库来提供扫描的首选方法是什么? 我正在寻找embedded到android,而不必提示用户进行任何额外的安装。 (类似于iPhone src的工作方式)。
通过Intent集成真的很容易。 更可靠,并自动更新。 虽然我不build议…
完整的源代码可以在ZXing项目中find。 你想从core/
core.jar
,并把它放在你的Android lib/
文件夹中,将核心解码器包含在你的应用程序中。 你不想包括javase
。 你可以看看android/
code中的代码,因为它是Barcode Scanner的源代码,但作为作者,我们build议你不要复制和粘贴它。
这是Apache许可 ,意味着您可以自由使用它,只要您基本上允许用户访问许可条款。
Android QR /条码/多格式解码器。
我已经使用ZXing API制作了一个Android应用程序,并且只将解码代码embedded到我的应用程序中。 这个解码器的input是通过Android模拟器的SD卡给出的。
这里是步骤:
-
首先,我在Eclipse IDE中创build了一个AVD(模拟器)版本4,SD卡和相机function打开。
-
接下来,我使用命令提示符下面的命令创build了一个SDCard:
c:\>mksdcard 40M mysdcard.iso
其中40M是我创build的SD卡的大小..这将被保存在C:驱动器。 请注意,.iso部分很重要。
-
接下来,我们必须在命令提示符下使用以下命令将SD卡安装到仿真器中:
c:\>emulator -sdcard "c:\mysdcard.iso" @myavd4
这里myavd4是我在步骤1中创build的模拟器/ android虚拟设备的名称。avd名称之前的“@”符号也很重要。
保持模拟器始终运行。如果closures,我们必须重新执行上述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中的包中。
(请注意,右键单击我们项目的包并粘贴…如果它要求replace现有的文件夹,请select是)
-
接下来,将以下代码复制并粘贴到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文件中(如果不存在),请创build一个。
<?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" />
-
所以,上述步骤完成…我们的应用程序已经准备就绪。 现在,你可以运行应用程序,它会给你我们给出的input图像的解码结果。
-
为了改变input,使用命令提示符下面的命令将另一个文件推到SD卡
c:\>adb push "c:\image2.png" /sdcard
并改变QRDecoder.java中的input以反映相同的内容
Bitmap bMap = BitmapFactory.decodeFile("/sdcard/image.png");
input可以是像QRCode,条码等任何格式….图像的types可以是BMP,JPG或PNG。
我使用下面的网站来生成用于testing目的的QR码
谢谢,我想提一点,我只是一个在Android和移动应用程序开发初学者,并为我可能已经做的任何错误抱歉…
如果遵循Palani的回答,只想导入zxing核心。 这里是你如何使用RGBLuminanceSource而不需要导入zxing.androidtest 。
// 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 :
条形码API以任何方向实时检测设备上的条形码。 它也可以一次检测多个条形码。
它读取以下条形码格式:
- 一维条码:EAN-13,EAN-8,UPC-A,UPC-E,Code-39,Code-93,Code-128,ITF,Codabar
- 二维条码:QR Code,Data Matrix,PDF-417,AZTEC
它会自动parsingQR码,Data Matrix,PDF-417和Aztec值,以下支持的格式:
- url
- 联系信息(VCARD等)
- 日历活动
- 电子邮件
- 电话
- 短信
- 国际标准书号
- 无线上网
- 地理位置(经度和纬度)
- AAMVA驾驶执照/身份证
我自己试过这个方法,大部分似乎都起作用了。
虽然我有几点要做
-
它会抱怨com.google.zxing.client.androidtest软件包,它是包中find的RGBLuminanceSource类所需要的,并在QRDecoder Activity中使用。导入zxing / androidtest包也是如此。
-
如果你在包的外面添加Zxing库,那么你将需要编辑所有R.java引用,因为它不会在它的包中findR.java文件。
例如:
代替
mRunBenchmarkButton = (Button) findViewById(R.id.benchmark_run);
在BenchmarkActivity.java文件中使用
mRunBenchmarkButton = (Button) findViewById(yourpackage.R.id.benchmark_run);
我们也可以使用Eclipse的DDMS接口将QR码推送到设备的SDCard。
使用DDMS
https://github.com/dm77/barcodescanner
我比较喜欢Google Play服务的这个lib,因为像往常一样,Google Play服务需要在设备上安装相同的版本。
它将Zxing与新的构build系统embedded在一起,并提供一个aar。 真的很酷。
我试图embeddedZXing (XZing)一段时间,直到我发现Zbar。 他们有一个easyerembedded式的方式,更less的代码和简单的例子。
- 当Android PopupWindow激活时模糊或昏暗的背景
- Ant无法findjavac,JAVA_HOME不会在Ubuntu上设置
- 如何创buildFragment和适配器之间的接口?
- android布局:这个标签及其子元素可以被一个<TextView />和一个复合的drawable所取代
- LinearLayout不在ScrollView内部扩展
- CMUSphinx PocketSphinx – 识别所有(或大量)单词
- RecyclerView中的单选
- 无法修改ListView中的ArrayAdapter:UnsupportedOperationException
- Android获得免费的内部/外部内存大小