Incrustar la biblioteca ZXing sin usar la aplicación de escáner de código de barras [duplicado
Pregunta
Esta pregunta ya tiene una respuesta aquí:
¿Cuál es la forma preferida de incrustar la biblioteca ZXing para proporcionar escaneo sin instalar la aplicación de escáner de código de barras? Estoy buscando incrustarlo en Android sin tener que solicitar al usuario las instalaciones adicionales. (Similar a la forma en que funciona el iPhone SRC).
Solución
Es realmente más fácil simplemente integrarse a través de Intención. Más confiable y obtienes actualizaciones automáticamente. Mientras no lo aconsejo ...
El código fuente completo está disponible en el Zx proyecto. Quieres construir core.jar
de core/
y ponlo en tu Android lib/
Carpeta para incluir el decodificador central en su aplicación. No quieres incluir javase
. Puedes mirar el código en android/
Como es la fuente del escáner de código de barras, pero como los autores le sugeriríamos que no solo lo copie y lo pegue.
Está Apache con licencia Lo que significa que puede usarlo libremente, siempre que esencialmente le dé acceso al usuario a los términos de la licencia.
Otros consejos
Android QR/Barcode/Multiformat Decoder.
He realizado una aplicación de Android usando las API ZXing e integrado 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.
Aquí están los pasos:
Primero, creé una versión 4 AVD (emulador) en mi Eclipse IDE con la tarjeta SD y las características de la cámara activadas.
A continuación, he creado una SDCARD usando los comandos a continuación en el símbolo del sistema:
c:\>mksdcard 40M mysdcard.iso
donde 40m es el tamaño de la tarjeta SD que he creado ... esto se guardará en la unidad C:. Tenga en cuenta que la parte .ISO es importante.
A continuación, tenemos que montar la tarjeta SD en el emulador utilizando los comandos a continuación en el símbolo del sistema:
c:\>emulator -sdcard "c:\mysdcard.iso" @myavd4
Aquí MyAVD4 es el nombre del dispositivo Virtual Emulator/Android que creé en el Paso 1. El signo '@' antes del nombre AVD también es importante.
Mantenga el emulador en funcionamiento todo el tiempo ... si se cerra, tenemos que rehacer los 3 pasos anteriores.
Podemos presionar el código QR u otras imágenes de código que tenemos a esta tarjeta SD montada en nuestro emulador utilizando los comandos a continuación en el símbolo del sistema:
c:\>adb push "c:\myqrcode.png" /sdcard
Luego, en el Eclipse IDE, comience un nuevo proyecto de Android. El siguiente código 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); } }
A continuación, descargué el código fuente de ZXing (ZXing-1.6.zip) del siguiente enlace.
http://code.google.com/p/zxing/downloads/list
Luego, extraiga esto y navegue a d: zxing-1.6 core src com
Copie la carpeta COM y péguela en nuestro paquete en Eclipse.
(Nota, haga clic derecho en el paquete de nuestro proyecto y pegue ... si solicita reemplazar la carpeta existente, seleccione Sí)
A continuación, copie y pegue el siguiente código en el archivo res/diseño/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>
A continuación, copie y pegue 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>
A continuación, copie y pegue el siguiente código en el archivo res/valores/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>
A continuación, copie y pegue 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" />
Entonces, 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 hemos dado.
Para cambiar la entrada, presione otro archivo a la tarjeta SD usando el comando a continuación en el símbolo del sistema
c:\>adb push "c:\image2.png" /sdcard
y cambie la entrada en nuestro qrdecoder.java para reflejar lo mismo
Bitmap bMap = BitmapFactory.decodeFile("/sdcard/image.png");
Las entradas pueden ser cualquier formato como QRCode, Barcode, etc. Los tipos de imagen pueden ser BMP, JPG o PNG.
Utilicé el sitio web a continuación para generar los códigos QR para fines de prueba
Gracias y me gustaría mencionar el punto de que solo soy un principiante en el desarrollo de aplicaciones de Android y móviles y lamento los errores que podría haber cometido ...
Si están siguiendo la respuesta de Palani y solo quieren importar Zxing Core. Así es como puedes usar Rgbluminesource 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();
}
Ahora puedes usar el API oficial de código de barras de 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, Code-39, Code-93, Code-128, ITF, Codabar
- Códigos de barras 2D: código QR, Matriz de datos, PDF-417, AZTEC
Analiza automáticamente los códigos QR, la matriz de datos, los valores PDF-417 y AZTEC, para los siguientes formatos admitidos:
- Url
- Información de contacto (VCard, etc.)
- Evento calendario
- Correo electrónico
- Teléfono
- SMS
- ISBN
- Wifi
- Geo-ubicación (latitud y longitud)
- AAMVA Licencia/ID de conducir
Yo mismo probé este método, al máximo todo parecía funcionar.
Aunque tengo algunos puntos para hacer
Se quejará del paquete com.google.zxing.client.androidtest que es necesario para la clase RGBLuminesource que se encuentra en el paquete y se usa en la actividad QRDECoder. También importe el paquete ZXing/AndroidTest también.
Si está agregando la biblioteca ZXing fuera de su paquete, deberá editar todas las referencias de R.Java, ya que no encontrará el archivo r.java en su paquete.
Por ejemplo:
En vez de
mRunBenchmarkButton = (Button) findViewById(R.id.benchmark_run);
En el archivo de archivo de BenchmarkActivity.java
mRunBenchmarkButton = (Button) findViewById(yourpackage.R.id.benchmark_run);
También podemos usar la interfaz DDMS de Eclipse para empujar el Ccode QR a la tarjeta SD de dispositivo.
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 el zx en el nuevo sistema de compilación y proporciona un AAR. Realmente genial.
Traté de insertar Zx (Xzing) por un tiempo, hasta que descubrí Zbar. Tienen una forma más fácil de integrar, menos código y ejemplos fáciles.