2011-01-31 15 views
58

¿Cuál es la forma preferida de incrustar la biblioteca zxing para proporcionar escaneo sin tener instalada la aplicación Barcode Scanner? Estoy buscando incrustarlo en Android sin tener que solicitar al usuario ninguna instalación adicional. (Similar a la forma en que funciona el iPhone src).Incrustar biblioteca Zxing sin utilizar la aplicación Barcode Scanner

+0

Descargue los componentes core y javase e incrústelos, tal vez. –

+1

Pero, necesita ver la licencia y ver qué puede hacer, si puede simplemente incluirla en su programa. –

Respuesta

59

Es realmente más fácil integrar solo a través de Intent. Más confiable, y obtienes actualizaciones automáticamente. Si bien no lo aconsejo ...

El código fuente completo está disponible en el proyecto ZXing. Desea compilar core.jar desde core/ y colocarlo en su carpeta Android lib/ para incluir el decodificador central en su aplicación. No desea incluir javase. Puede consultar el código en android/ ya que es la fuente de Barcode Scanner, pero como autores le sugerimos que no solo copie y pegue.

Es Apache licensed lo que significa que puede usarlo libremente, siempre y cuando esencialmente le dé acceso al usuario a los términos de la licencia.

+62

¿No tendría sentido tener una versión de la biblioteca de Android? A veces, pedirle a los usuarios que descarguen una aplicación de terceros simplemente no es una solución ... – MasterScrat

+6

Ya existe una solución de biblioteca: 'core.jar'. Toda la aplicación de Android también está disponible para su reutilización (y algunas veces se copia sin ética). No estoy seguro de qué puede ser más fácil. –

+12

Hay un * lote * de código específico de Android fuera de core.jar. Creo que MasterScrat estaba pidiendo un proyecto de biblioteca * Android *. Algo que le daría puntos de vista y soporte de cámara, etc., sin todo lo que necesita BarcodeScanner. – pforhan

29

Android QR/Barcode/Multiformat Decoder.

He creado una aplicación de Android utilizando las API de ZXing e incrustado solo el código de decodificación en mi aplicación. La entrada a este decodificador se dio a través de la tarjeta SD del emulador de Android.

Estos son los pasos:

  1. En primer lugar, he creado un (emulador) AVD versión 4 en mi IDE Eclipse con la tarjeta SD y funciones de la cámara encendida.

  2. A continuación, he creado una tarjeta SD usando los siguientes comandos en el símbolo del sistema:

    c:\>mksdcard 40M mysdcard.iso 
    

donde 40M es el tamaño de la tarjeta SD que tengo created..This se guardarán en la C: unidad. Tenga en cuenta que la parte .iso es importante.

  1. A continuación, se tiene que montar la tarjeta SD en el emulador usando los siguientes comandos en el símbolo del sistema:

    c:\>emulator -sdcard "c:\mysdcard.iso" @myavd4 
    

Aquí myavd4 es el nombre del dispositivo virtual emulador/android que creé en el paso 1. El signo '@' antes del nombre avd también es importante.

Mantenga el emulador funcionando todo el tiempo ... Si se cierra, tenemos que volver a hacer los 3 pasos anteriores.

  1. Podemos empujar el código QR o resto de imágenes de código que tenemos que esta tarjeta SD montada en nuestro emulador mediante el uso de los siguientes comandos en el símbolo del sistema:

    c:\>adb push "c:\myqrcode.png" /sdcard 
    
  2. A continuación, en el Eclipse IDE, inicia un nuevo proyecto de Android. El código siguiente debe pegarse en el archivo QRDecoder.java de nuestro proyecto.

    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. A continuación he descargado el código fuente ZXing (ZXing-1.6.zip) desde el siguiente enlace.

    http://code.google.com/p/zxing/downloads/list 
    

A continuación, extraer este y vaya a D: \ ZXing-1.6 \ core \ src \ com

copiar la carpeta com y pegarlo en nuestro paquete en Eclipse.

(Nota, haga clic derecho sobre el paquete de nuestro proyecto y pegar ... si pide reemplazar la carpeta existente, seleccione sí)

  1. A continuación, copia y pega el código de abajo en la res /layout/main.xml presentar

    <?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. a continuación, copia y pega el siguiente código en el archivo res/valores/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. A continuación, copie y pegue el siguiente código en el archivo res/values ​​/ color.xml, si no existe, cree uno.

    <?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. A continuación, copia y pega el siguiente código en el archivo de manifiesto después de la etiqueta de apertura

    <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. Por lo tanto, estos pasos anteriores realizados ... nuestra aplicación está lista. Ahora puede ejecutar la aplicación y le dará el resultado decodificado de la imagen de entrada que le hemos dado.

  6. Para cambiar la entrada, empujar otro archivo en la tarjeta SD usando el siguiente comando en el símbolo del sistema

    c:\>adb push "c:\image2.png" /sdcard 
    

y cambie la entrada en nuestro QRDecoder.java para reflejar el mismo

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

las entradas pueden ser de cualquier formato, como QRCode, Barcode, etc. ... los tipos de imagen pueden ser bmp, jpg o png.

he utilizado el sitio web a continuación para generar los códigos QR para el propósito de la prueba

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

Y http://qrcode.kaywa.com

Gracias y me gustaría mencionar el punto de que sólo soy un principiante en el androide y desarrollo de aplicaciones móviles y lo siento por cualquier error que podría haber hecho ...

+1

Gran descripción. Realmente me ayudó a poner en funcionamiento mi lector de código de barras. ¡Gracias! – Betaminos

2

Yo mismo probé este método y, sobre todo, parecía funcionar.

Aunque tengo algunos puntos para hacer

  1. Se quejan de la com.google.zxing.client.androidtest paquete que se necesita para la clase RGBLuminanceSource encuentra en el paquete y se utiliza en la QRDecoder Activity.So importa el paquete zxing/androidtest también.

  2. Si está agregando la Biblioteca Zxing fuera de su paquete, deberá editar todas las referencias R.java, ya que no encontrará el archivo R.java en su paquete.

Por ejemplo:

En lugar de

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

en el archivo de uso BenchmarkActivity.java

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

También podemos utilizar la interfaz DDMS de Eclipse para empujar el Código QR a la tarjeta SD del dispositivo.

Using DDMS

-1

Me trataron de integrar ZXing (Xzing) por un tiempo, hasta que descubrí Zbar. Tienen una manera fácil de incorporar, menos código y ejemplos fáciles.

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

+1

ZBar no se ha actualizado en más de un año. – CodyBugstein

+0

ZBar no se ha actualizado desde febrero de 2013. –

4

Si están siguiendo respuesta Palani y sólo desea importar ZXing núcleo. Aquí se explica cómo puede usar RGBLuminanceSource sin importar 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(); 
} 
+0

Sí, eso es lo que mostré aquí en lugar de usar RGBLuminanceSource de com.google.zxing.client.androidtest, como en la respuesta de Palani, que tiene diferentes parámetros. –

+0

Vaya, leí mal entonces. –

4

Now puede utilizar el official Barcode API from Google:

La API de código de barras detecta códigos de barras en tiempo real, en el dispositivo, en cualquier orientación. También puede detectar múltiples códigos de barras a la vez.

lee los siguientes formatos de código de barras:

  • códigos de barras 1D: EAN-13, EAN-8, UPC-A, UPC-E, Código-39, Código 93, Código 128, ITF, codabar
  • códigos de barras 2D: Código QR, Data Matrix, PDF-417, azteca

Se analiza automáticamente los códigos QR, Data Matrix, PDF-417, y valores aztecas, para los siguientes formatos soportados:

  • URL
  • Información de contacto (VCARD, etc.)
  • evento de calendario
  • correo electrónico
  • Teléfono
  • SMS
  • ISBN
  • WiFi
  • Geo-localización (latitud y longitud)
  • licencia de conducir AAMVA/Identificación
+1

¡Solo si su usuario tiene una conexión a Internet activa, no es adecuado para nuestro almacén! – dave

+1

para usar esta aplicación de Google Play 7.8 es requerida. –

+0

@dave: ¿has probado eso? La publicación dice específicamente "Importante, todo el análisis de códigos de barras se hace localmente", y [el codelab] (https://codelabs.developers.google.com/codelabs/bar-codes/#0) menciona específicamente "Importante, todo el código de barras el análisis se realiza localmente, por lo que no es necesario realizar un viaje de ida y vuelta del servidor para leer los datos del código. " –

0

https://github.com/dm77/barcodescanner

Preferí esta lib sobre los servicios de Google Play porque, como de costumbre, Google Play Services requiere la misma versión instalada en el dispositivo.

Incorpora Zxing con el nuevo sistema de compilación y proporciona un aar. Realmente genial.

Cuestiones relacionadas