在不使用Barcode Scanner应用程序的情况下嵌入Zxing库

时间:2011-01-31 18:13:27

标签: android zxing

在没有安装Barcode Scanner应用程序的情况下,嵌入zxing库以提供扫描的首选方法是什么?我希望将它嵌入到android中,而不必提示用户任何额外的安装。 (类似于iPhone src的工作方式)。

7 个答案:

答案 0 :(得分:59)

通过Intent进行整合真的更容易。更可靠,您可以自动获得更新。虽然我不建议......

完整的源代码可从ZXing项目获得。您想从core.jar构建core/并将其放入Android lib/文件夹,以在您的应用中包含核心解码器。您不想包含javase。您可以查看android/中的代码,因为它是条形码扫描程序的来源,但作为作者,我们建议您不要只复制并粘贴它。

它是Apache licensed,这意味着您可以自由使用它,只要您基本上允许用户访问许可条款。

答案 1 :(得分:29)

Android QR /条形码/多格式解码器。

我使用ZXing API创建了一个Android应用程序,并且只将解码代码嵌入到我的应用程序中。该解码器的输入是通过Android模拟器的SD卡提供的。

以下是步骤:

  1. 首先,我在Eclipse IDE中创建了一个AVD(模拟器)版本4,SD卡和相机功能已打开。

  2. 接下来,我在命令提示符中使用以下命令创建了一个SDCard:

    c:\>mksdcard 40M mysdcard.iso
    
  3. 其中40M是我创建的SD卡的大小。这将保存在C:驱动器中。注意,.iso部分很重要。

    1. 接下来,我们必须使用命令提示符中的以下命令将SD卡安装到模拟器中:

       c:\>emulator -sdcard "c:\mysdcard.iso" @myavd4
      
    2. 这里myavd4是我在步骤1中创建的模拟器/ android虚拟设备的名称.avd名称前面的'@'符号也很重要。

      保持模拟器始终运行。如果它关闭,我们必须重做上述3个步骤。

      1. 我们可以在命令提示符中使用以下命令将我们拥有的QR码或其他代码图像推送到我们的仿真器上安装的SD卡:

        c:\>adb push "c:\myqrcode.png" /sdcard
        
      2. 接下来,在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);
        
            }
        
        }
        
      3. 接下来,我从以下链接下载了ZXing源代码(ZXing-1.6.zip)。

        http://code.google.com/p/zxing/downloads/list
        
      4. 然后,解压缩并导航到D:\ zxing-1.6 \ core \ src \ com

        复制com文件夹并将其粘贴到Eclipse中的包中。

        (注意,右键单击我们项目的包并粘贴......如果要求替换现有文件夹,请选择是)

        1. 接下来,将以下代码复制并粘贴到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>
          
        2. 接下来,将以下代码复制并粘贴到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>
          
        3. 接下来,将以下代码复制并粘贴到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>
          
        4. 接下来,将以下代码复制并粘贴到开始标记

          之后的清单文件中
          <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" />      
          
        5. 所以,完成上述步骤......我们的应用已准备就绪。现在,你可以运行应用程序,它会给你我们给出的输入图像的解码结果。

        6. 要更改输入,请在命令提示符中使用以下命令将另一个文件推送到SD卡

          c:\>adb push "c:\image2.png" /sdcard
          
        7. 并更改QRDecoder.java中的输入以反映相同的

              Bitmap bMap = BitmapFactory.decodeFile("/sdcard/image.png");
          

          输入可以是任何格式,如QRCode,条形码等....图像类型可以是bmp,jpg或png。

          我使用以下网站生成用于测试目的的QR码

          http://barcode.tec-it.com/

          AND http://qrcode.kaywa.com

          谢谢,我想提一下,我只是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)

我自己尝试过这种方法,其中大部分似乎都有用。

虽然我有几点要做

  1. 它会抱怨com.google.zxing.client.androidtest软件包,它是在软件包中找到并在QRDecoder Activity中使用的RGBLuminanceSource类所必需的。 导入zxing / androidtest包。

  2. 如果要在包外添加Zxing库,则需要编辑所有R.java引用,因为它在包中找不到R.java文件。

  3. 例如:

    而不是

    mRunBenchmarkButton = (Button) findViewById(R.id.benchmark_run);
    
    在BenchmarkActivity.java文件中

    使用

    mRunBenchmarkButton = (Button) findViewById(yourpackage.R.id.benchmark_run);
    

    我们也可以使用Eclipse的DDMS接口将QRCode推送到设备SDCard。

    Using DDMS

答案 5 :(得分:0)

https://github.com/dm77/barcodescanner

我比Google Play服务更喜欢这个lib,因为像往常一样,谷歌 Play服务需要在设备上安装相同的版本。

它将Zxing与新的构建系统嵌入并提供了一个aar。真的很酷。

答案 6 :(得分:-1)

我试图嵌入 ZXing (XZing)一段时间,直到我发现了Zbar。他们有一种更简单的嵌入方式,更少的代码和简单的示例。

http://sourceforge.net/projects/zbar/