Integrando la biblioteca ZXing directamente en mi aplicación Android

Estoy escribiendo esto en mera desesperación 🙂 Me asignaron para hacer un escáner de código de barras independiente (como una prueba de concepto) para un teléfono con Android 1.6.

Para esto he descubierto la biblioteca ZXing.

Busqué en Google, leí temas relacionados aquí en StackOverflow, uso de sentido común, etc. Nada parecía haber ayudado, y simplemente no puedo abrir un agujero en este locking de mentale: /

Sé que es posible, usar lib y crear tu propio escáner de código de barras independiente. He leído que usar el “Barcode Scanner” proporcionado por la gente de Zxing es, de lejos, la solución más fácil (a través de Intent). Lamentablemente, esta no es una opción, y se desea una aplicación independiente.

Entonces, para resumir mi problema:

  1. ¿Cómo integrar ZXing source lib en mi proyecto de código de Android a través de Eclipse?
  2. Cuando está integrado … ¿cómo hacer uso de la lib, para “cargar” la función de escaneo?
  3. Una guía paso a paso es casi preferible porque recién comencé a trabajar en Eclipse.

Intenté hacer que mi proyecto de código dependiera de la carpeta de Android desde la carpeta de origen de ZXing. Cuando lo hago, surgen un puñado de errores, principalmente sobre ‘org.apache’ (??)

Simplemente no puedo resolverlo … así que algunas sugerencias serían de lo más útil.

De antemano, gracias 🙂

¡ACTUALIZAR! – SOLUCIONADO + GUIA

Me las he arreglado para resolverlo 🙂 Y a continuación puedes leer la guía paso a paso para que pueda ayudar a otros con el mismo problema que yo tuve;)

  1. Instalar Apache Ant – ( Consulte este video de YouTube para obtener ayuda sobre las configuraciones )
  2. Descargue la fuente de ZXing desde la página de inicio de ZXing y extráigala
  3. Con el uso de la línea de comandos de Windows (Ejecutar-> CMD) navegue hasta el directorio raíz del zxing src descargado.
  4. En la ventana de línea de comandos: escriba ant -f core/build.xml presione Entrar y deje que Apache trabaje es mágico [¿ tiene problemas? ]
  5. Ingrese Eclipse -> nuevo Android Project, basado en la carpeta android en el directorio que acaba de extraer
  6. Haga clic derecho en la carpeta del proyecto -> Propiedades -> Ruta de comstackción de Java -> Biblioteca -> Agregar JAR externos …
  7. Navega a la carpeta recién extraída y abre el directorio central y selecciona core.jar … presiona enter!

Ahora solo tiene que corregir algunos errores en las traducciones y en el archivo AndroidManifest.xml 🙂 Ahora puede comstackr, y ahora tendrá una aplicación independiente de escáner de código de barras, basada en la fuente ZXing;)

Happy coding guys – Espero que pueda ayudar a los demás 🙂

Aquí hay una guía paso a paso sobre cómo generar y mostrar código QR usando la biblioteca ZXing sin tener que instalar la aplicación de terceros. Nota: no es necesario crear ZXing con ANT o cualquier otra herramienta de comstackción. El archivo core.jar está disponible en el archivo comprimido liberado (lea a continuación).

  1. Descargue la última versión de ZXing . – ( ZXing-*.zip )
  2. Extraiga este archivo zip y encuentre core.jar en core/ directory.
  3. Si está utilizando Eclipse IDE, arrastre y suelte core.jar en el directorio libs de su proyecto de Android. Cuando se le pregunte, seleccione Copiar .
  4. Copie las dos clases que figuran a continuación ( Contents.java y QRCodeEncoder.java ) en el paquete principal de su proyecto Android.
  5. Cree un elemento ImageView en su Actividad para mostrar el código QR generado si aún no tiene uno. Un ejemplo se da a continuación:
  6. Utilice el fragmento de código siguiente para generar el código QR en formato de bitmap y mostrarlo en un ImageView .

Aquí hay un elemento ImageView para agregar a su archivo XML de diseño de la actividad:

  

Fragmento de código:

 // ImageView to display the QR code in. This should be defined in // your Activity's XML layout file ImageView imageView = (ImageView) findViewById(R.id.qrCode); String qrData = "Data I want to encode in QR code"; int qrCodeDimention = 500; QRCodeEncoder qrCodeEncoder = new QRCodeEncoder(qrData, null, Contents.Type.TEXT, BarcodeFormat.QR_CODE.toString(), qrCodeDimention); try { Bitmap bitmap = qrCodeEncoder.encodeAsBitmap(); imageView.setImageBitmap(bitmap); } catch (WriterException e) { e.printStackTrace(); } 

Aquí está Contents.java

 // // * Copyright (C) 2008 ZXing authors // * // * Licensed under the Apache License, Version 2.0 (the "License"); // * you may not use this file except in compliance with the License. // * You may obtain a copy of the License at // * // * http://www.apache.org/licenses/LICENSE-2.0 // * // * Unless required by applicable law or agreed to in writing, software // * distributed under the License is distributed on an "AS IS" BASIS, // * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // * See the License for the specific language governing permissions and // * limitations under the License. // import android.provider.ContactsContract; public final class Contents { private Contents() { } public static final class Type { // Plain text. Use Intent.putExtra(DATA, string). This can be used for URLs too, but string // must include "http://" or "https://". public static final String TEXT = "TEXT_TYPE"; // An email type. Use Intent.putExtra(DATA, string) where string is the email address. public static final String EMAIL = "EMAIL_TYPE"; // Use Intent.putExtra(DATA, string) where string is the phone number to call. public static final String PHONE = "PHONE_TYPE"; // An SMS type. Use Intent.putExtra(DATA, string) where string is the number to SMS. public static final String SMS = "SMS_TYPE"; public static final String CONTACT = "CONTACT_TYPE"; public static final String LOCATION = "LOCATION_TYPE"; private Type() { } } public static final String URL_KEY = "URL_KEY"; public static final String NOTE_KEY = "NOTE_KEY"; // When using Type.CONTACT, these arrays provide the keys for adding or retrieving multiple phone numbers and addresses. public static final String[] PHONE_KEYS = { ContactsContract.Intents.Insert.PHONE, ContactsContract.Intents.Insert.SECONDARY_PHONE, ContactsContract.Intents.Insert.TERTIARY_PHONE }; public static final String[] PHONE_TYPE_KEYS = { ContactsContract.Intents.Insert.PHONE_TYPE, ContactsContract.Intents.Insert.SECONDARY_PHONE_TYPE, ContactsContract.Intents.Insert.TERTIARY_PHONE_TYPE }; public static final String[] EMAIL_KEYS = { ContactsContract.Intents.Insert.EMAIL, ContactsContract.Intents.Insert.SECONDARY_EMAIL, ContactsContract.Intents.Insert.TERTIARY_EMAIL }; public static final String[] EMAIL_TYPE_KEYS = { ContactsContract.Intents.Insert.EMAIL_TYPE, ContactsContract.Intents.Insert.SECONDARY_EMAIL_TYPE, ContactsContract.Intents.Insert.TERTIARY_EMAIL_TYPE }; } 

Y QRCodeEncoder.java

 /* * Copyright (C) 2008 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import android.provider.ContactsContract; import android.graphics.Bitmap; import android.os.Bundle; import android.telephony.PhoneNumberUtils; import java.util.Collection; import java.util.EnumMap; import java.util.HashSet; import java.util.Map; import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHintType; import com.google.zxing.MultiFormatWriter; import com.google.zxing.WriterException; import com.google.zxing.common.BitMatrix; public final class QRCodeEncoder { private static final int WHITE = 0xFFFFFFFF; private static final int BLACK = 0xFF000000; private int dimension = Integer.MIN_VALUE; private String contents = null; private String displayContents = null; private String title = null; private BarcodeFormat format = null; private boolean encoded = false; public QRCodeEncoder(String data, Bundle bundle, String type, String format, int dimension) { this.dimension = dimension; encoded = encodeContents(data, bundle, type, format); } public String getContents() { return contents; } public String getDisplayContents() { return displayContents; } public String getTitle() { return title; } private boolean encodeContents(String data, Bundle bundle, String type, String formatString) { // Default to QR_CODE if no format given. format = null; if (formatString != null) { try { format = BarcodeFormat.valueOf(formatString); } catch (IllegalArgumentException iae) { // Ignore it then } } if (format == null || format == BarcodeFormat.QR_CODE) { this.format = BarcodeFormat.QR_CODE; encodeQRCodeContents(data, bundle, type); } else if (data != null && data.length() > 0) { contents = data; displayContents = data; title = "Text"; } return contents != null && contents.length() > 0; } private void encodeQRCodeContents(String data, Bundle bundle, String type) { if (type.equals(Contents.Type.TEXT)) { if (data != null && data.length() > 0) { contents = data; displayContents = data; title = "Text"; } } else if (type.equals(Contents.Type.EMAIL)) { data = trim(data); if (data != null) { contents = "mailto:" + data; displayContents = data; title = "E-Mail"; } } else if (type.equals(Contents.Type.PHONE)) { data = trim(data); if (data != null) { contents = "tel:" + data; displayContents = PhoneNumberUtils.formatNumber(data); title = "Phone"; } } else if (type.equals(Contents.Type.SMS)) { data = trim(data); if (data != null) { contents = "sms:" + data; displayContents = PhoneNumberUtils.formatNumber(data); title = "SMS"; } } else if (type.equals(Contents.Type.CONTACT)) { if (bundle != null) { StringBuilder newContents = new StringBuilder(100); StringBuilder newDisplayContents = new StringBuilder(100); newContents.append("MECARD:"); String name = trim(bundle.getString(ContactsContract.Intents.Insert.NAME)); if (name != null) { newContents.append("N:").append(escapeMECARD(name)).append(';'); newDisplayContents.append(name); } String address = trim(bundle.getString(ContactsContract.Intents.Insert.POSTAL)); if (address != null) { newContents.append("ADR:").append(escapeMECARD(address)).append(';'); newDisplayContents.append('\n').append(address); } Collection uniquePhones = new HashSet(Contents.PHONE_KEYS.length); for (int x = 0; x < Contents.PHONE_KEYS.length; x++) { String phone = trim(bundle.getString(Contents.PHONE_KEYS[x])); if (phone != null) { uniquePhones.add(phone); } } for (String phone : uniquePhones) { newContents.append("TEL:").append(escapeMECARD(phone)).append(';'); newDisplayContents.append('\n').append(PhoneNumberUtils.formatNumber(phone)); } Collection uniqueEmails = new HashSet(Contents.EMAIL_KEYS.length); for (int x = 0; x < Contents.EMAIL_KEYS.length; x++) { String email = trim(bundle.getString(Contents.EMAIL_KEYS[x])); if (email != null) { uniqueEmails.add(email); } } for (String email : uniqueEmails) { newContents.append("EMAIL:").append(escapeMECARD(email)).append(';'); newDisplayContents.append('\n').append(email); } String url = trim(bundle.getString(Contents.URL_KEY)); if (url != null) { // escapeMECARD(url) -> wrong escape eg http\://zxing.google.com newContents.append("URL:").append(url).append(';'); newDisplayContents.append('\n').append(url); } String note = trim(bundle.getString(Contents.NOTE_KEY)); if (note != null) { newContents.append("NOTE:").append(escapeMECARD(note)).append(';'); newDisplayContents.append('\n').append(note); } // Make sure we've encoded at least one field. if (newDisplayContents.length() > 0) { newContents.append(';'); contents = newContents.toString(); displayContents = newDisplayContents.toString(); title = "Contact"; } else { contents = null; displayContents = null; } } } else if (type.equals(Contents.Type.LOCATION)) { if (bundle != null) { // These must use Bundle.getFloat(), not getDouble(), it's part of the API. float latitude = bundle.getFloat("LAT", Float.MAX_VALUE); float longitude = bundle.getFloat("LONG", Float.MAX_VALUE); if (latitude != Float.MAX_VALUE && longitude != Float.MAX_VALUE) { contents = "geo:" + latitude + ',' + longitude; displayContents = latitude + "," + longitude; title = "Location"; } } } } public Bitmap encodeAsBitmap() throws WriterException { if (!encoded) return null; Map hints = null; String encoding = guessAppropriateEncoding(contents); if (encoding != null) { hints = new EnumMap(EncodeHintType.class); hints.put(EncodeHintType.CHARACTER_SET, encoding); } MultiFormatWriter writer = new MultiFormatWriter(); BitMatrix result = writer.encode(contents, format, dimension, dimension, hints); int width = result.getWidth(); int height = result.getHeight(); int[] pixels = new int[width * height]; // All are 0, or black, by default for (int y = 0; y < height; y++) { int offset = y * width; for (int x = 0; x < width; x++) { pixels[offset + x] = result.get(x, y) ? BLACK : WHITE; } } Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); bitmap.setPixels(pixels, 0, width, 0, 0, width, height); return bitmap; } private static String guessAppropriateEncoding(CharSequence contents) { // Very crude at the moment for (int i = 0; i < contents.length(); i++) { if (contents.charAt(i) > 0xFF) { return "UTF-8"; } } return null; } private static String trim(String s) { if (s == null) { return null; } String result = s.trim(); return result.length() == 0 ? null : result; } private static String escapeMECARD(String input) { if (input == null || (input.indexOf(':') < 0 && input.indexOf(';') < 0)) { return input; } int length = input.length(); StringBuilder result = new StringBuilder(length); for (int i = 0; i < length; i++) { char c = input.charAt(i); if (c == ':' || c == ';') { result.append('\\'); } result.append(c); } return result.toString(); } } 

los

 compile 'com.google.zxing:core:2.3.0' 

lamentablemente no funcionó para mí.

Esto es lo que funcionó para mí:

 dependencies { compile 'com.journeyapps:zxing-android-embedded:3.0.1@aar' compile 'com.google.zxing:core:3.2.0' } 

Encuentre el enlace aquí: https://github.com/journeyapps/zxing-android-embedded

¿Tienes problemas para construir con ANT? Sigue leyendo

Si ant -f core/build.xml dice algo así como:

 Unable to locate tools.jar. Expected to find it in C:\Program Files\Java\jre6\lib\tools.jar 

luego configure su variable de entorno JAVA_HOME en la carpeta java apropiada. Encontré tools.jar en mi (para Windows):

 C:\Program Files\Java\jdk1.6.0_21\lib 

entonces configuro mi JAVA_HOME a:

 C:\Progra~1\Java\jdk1.6.0_25 

la razón de la syntax más corta que encontré en algún sitio que dice:

“Se recomienda encarecidamente que elija un directorio de instalación que no incluya espacios en el nombre de la ruta (por ejemplo, NO instale en C: \ Archivos de progtwig). Si Java está instalado en dicho directorio, es fundamental configurar el JAVA_HOME variable de entorno a una ruta que no incluye espacios (p. ej., C: \ Progra ~ 1); el hecho de no hacerlo dará lugar a excepciones lanzadas por algunos progtwigs que dependen del valor de JAVA_HOME “.

Reanuncié cmd (importante porque el shell de DOS solo lee los archivos al iniciarse, por lo que cambiar un env var requerirá que uses un nuevo shell para obtener el valor actualizado)

y finalmente el ant -f core/build.xml funcionó.

Como algunas de las respuestas están desactualizadas, me gustaría brindar las mías:

Para integrar la biblioteca ZXing en su aplicación Android como lo sugiere su Wiki , debe agregar 2 archivos Java a su proyecto:

  • IntentIntegrator.java
  • IntentResult.java

Luego, en Android Studio, agregue la siguiente línea al archivo build.gradle :

 dependencies { .... compile 'com.google.zxing:core:3.2.1' } 

O si todavía está usando Eclipse con ADT-plugin, agregue el archivo core.jar al subdirectorio libs de su proyecto (aquí a pantalla completa Windows y Mac a pantalla completa ):

Captura de pantalla de Windows

Finalmente agregue este código a su MainActivity.java :

 public void scanQRCode(View v) { IntentIntegrator integrator = new IntentIntegrator(MainActivity.this); integrator.initiateScan(IntentIntegrator.QR_CODE_TYPES); } @Override public void onActivityResult(int requestCode, int resultCode, Intent intent) { IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, intent); if (result != null) { String contents = result.getContents(); if (contents != null) { showDialog(R.string.result_succeeded, result.toString()); } else { showDialog(R.string.result_failed, getString(R.string.result_failed_why)); } } } private void showDialog(int title, CharSequence message) { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle(title); builder.setMessage(message); builder.setPositiveButton(R.string.ok_button, null); builder.show(); } 

La aplicación resultante pedirá instalar e iniciar la aplicación Barcode Scanner por ZXing (que volverá a su aplicación automáticamente después del escaneo):

Aplicación Barcode Scanner

Además, si desea construir y ejecutar la aplicación ZXing Test como inspiración para su propia aplicación:

Aplicación de prueba ZXing

Entonces necesitas 4 archivos Java de GitHub :

  • BenchmarkActivity.java
  • BenchmarkAsyncTask.java
  • BenchmarkItem.java
  • ZXingTestActivity.java

Y 3 archivos jar del repository Maven :

  • core.jar
  • android-core.jar
  • android-integration.jar

(Puede crear los archivos Jar usted mismo con el mvn package , si echa un vistazo a ZXing desde GitHub e instale las herramientas ant y maven en su computadora).

Nota: si su proyecto no reconoce los archivos Jar, es posible que deba subir la versión de Java en Propiedades del proyecto:

captura de pantalla de propiedades

¿Has visto las páginas wiki en el sitio web zxing? Parece que puede ser útil utilizar GettingStarted , DeveloperNotes y ScanningViaIntent .

Poner

 compile 'com.google.zxing:core:2.3.0' 

en sus dependencias de Gradle. Tan fácil como eso. Antes de usar Android Studio y el sistema de comstackción Gradle.

Si solo necesita core.jar de zxing, puede omitir ese proceso y obtener los JAR preconstruidos de la página wiki GettingStarted.

La última versión de ZXing (2.2) no tiene core.jar en la carpeta principal, pero puede obtener core.jar del repository de zxing Maven aquí

Paso a paso para configurar zxing 3.2.1 en eclipse

  1. Descargue zxing-master.zip de ” https://github.com/zxing/zxing
  2. Descomprime zxing-master.zip, usa eclipse para importar el proyecto “android” en zxing-master
  3. Descargue core-3.2.1.jar de ” http://repo1.maven.org/maven2/com/google/zxing/core/3.2.1/
  4. Crea la carpeta “libs” en el proyecto “android” y pega cor-3.2.1.jar en la carpeta libs
  5. Haga clic en proyecto: elija “propiedades” -> “Comstackdor de Java” para cambiar el nivel a 1.7. A continuación, haga clic en “Android” para cambiar el “objective de comstackción del proyecto” a Android 4.4.2+, ya que el uso de 1.7 requiere la comstackción con Android 4.4
  6. Si “CameraConfigurationUtils.java” no existe en “zxing-master / android / app / src / main / java / com / google / zxing / client / android / camera /”. Puede copiarlo de “zxing-master / android-core / src / main / java / com / google / zxing / client / android / camera /” y pegarlo en su proyecto.
  7. Limpiar y construir proyecto. Si su proyecto muestra un error sobre “switch – case”, debe cambiarlo a “if – else”.
  8. Terminado. Limpiar y construir proyecto.
  9. Enlace de referencia: uso de ZXing para crear una aplicación de escaneo de códigos de barras de Android

Intenté todas las formas posibles de lograr esto y luego descubrí la versión Minified de xZing por JourneyApps. Lo he portado para eclipse y lo he compartido en GitHub.

Si está usando eclipse use este proyecto:

https://github.com/hiteshsahu/XZing-Barcode-Scanner-Minified-Eclipse

Si está usando Studio use este proyecto:

https://github.com/journeyapps/zxing-android-embedded

Ventajas

  1. El escáner de código de barras incorporado en su aplicación no requiere instalar aplicaciones de terceros usando playstore.

  2. No necesita confundirse entre Core, Android, etc. tarros, simplemente deje caer estos paquetes y diseños relevantes en su proyecto y ya está listo. Solo se requiere jar es com.google.zxing: core: 3.2.0 que puede descargar desde

    http://mvnrepository.com/artifact/com.google.zxing/core/3.2.0

  3. No es necesario agregar toneladas de paquetes ver imágenes a continuación para comparar

Antes de :-

enter image description here

Después :-

enter image description here

  1. La parte más importante es que son altamente personalizables, es decir. puede agregar una luz de flash, usarlo en fragmentos y cambiar la orientación de soporte.

  2. Puede usar esta actividad de Captura en la aplicación Cordova para escanear códigos de barras.

su actividad de captura en el manifiesto de la aplicación se vería así

        

y el complemento se verá así

 public class BarcodeScanner extends CordovaPlugin { public static final int REQUEST_CODE = 0x0ba7c0de; private static final String SCAN = "scan"; private static final String CANCELLED = "cancelled"; private static final String FORMAT = "format"; private static final String TEXT = "text"; private static final String SCAN_INTENT = "com.google.zxing.client.android.SCAN"; private static final String LOG_TAG = "BarcodeScanner"; private CallbackContext callbackContext; /** * Constructor. */ public BarcodeScanner() { } /** * Executes the request. * * This method is called from the WebView thread. To do a non-trivial amount of work, use: * cordova.getThreadPool().execute(runnable); * * To run on the UI thread, use: * cordova.getActivity().runOnUiThread(runnable); * * @param action The action to execute. * @param args The exec() arguments. * @param callbackContext The callback context used when calling back into JavaScript. * @return Whether the action was valid. * * @sa https://github.com/apache/cordova-android/blob/master/framework/src/org/apache/cordova/CordovaPlugin.java */ @Override public boolean execute(String action, JSONArray args, CallbackContext callbackContext) { this.callbackContext = callbackContext; if (action.equals(SCAN)) { scan(args); } else { return false; } return true; } /** * Starts an intent to scan and decode a barcode. */ public void scan(JSONArray args) { Intent intentScan = new Intent(SCAN_INTENT); intentScan.addCategory(Intent.CATEGORY_DEFAULT); // add config as intent extras if(args.length() > 0) { JSONObject obj; JSONArray names; String key; Object value; for(int i=0; i 

Feliz integración !!

Los chicos de zxing han hecho que sea más fácil crear un proyecto de Android con 1.7. No es tan doloroso como solía ser. Este es un blog rápido para cualquiera que desee crear un proyecto zxing para Android rápidamente.

  • Verifique las fonts zxing de zxing.org
  • Crea un proyecto de Android en tu eclipse
  • Eliminar main.xml
  • Haga clic derecho en el directorio “src” y presione importar. Busque los siguientes directorios en el orden mencionado. A medida que los agrega para la importación uno por uno, asegúrese de tener el directorio src en el campo de edición del asistente de importación. Y que seleccione solo el directorio “com” en el árbol de directorios izquierdo. No seleccione src.
  • núcleo
  • android-integration
  • android
  • Asegúrese de que su versión sdk de Android sea 9, cualquier cosa menor y androidmanifest.xml llorará.
  • Strings.xml en uno de los idiomas será cuna, simplemente ponga un / antes del ‘carácter

Un proyecto de Android para zxing 1.7 (20 de junio pago y envío).

http://www.4shared.com/file/bFx8Y5Ys/zXingJune2010.html ( NO DISPONIBLE MÁS )

¿Por qué usar una lib externa, cuando los servicios de google play (desde la versión 7.8.0 ) incluyen un decodificador de código de barras?

Enfoque mucho más fácil.

Solo incluya la dependencia en su archivo gradle de nivel de aplicación

 compile 'com.journeyapps:zxing-android-embedded:3.0.1@aar' compile 'com.google.zxing:core:3.2.0' 

Defina un botón en su archivo xml y escriba debajo el código en el archivo Java en OnCreate () y dentro del oyente OnClick del botón

 new IntentIntegrator(this).initiateScan(); 

Y escriba el código siguiente después de OnCreate () del archivo Java

 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data); if(result != null) { if(result.getContents() == null) { Log.d("MainActivity", "Cancelled scan"); Toast.makeText(this, "Cancelled", Toast.LENGTH_LONG).show(); } else { Log.d("MainActivity", "Scanned"); st_scanned_result = result.getContents(); Toast.makeText(this, "Scanned: " + result.getContents(), Toast.LENGTH_LONG).show(); } } } 

Recientemente utilicé google mobile vision tanto en iOS como en Android. Recomiendo usar Google Barcode Scan. Es muy sensible con cualquier orientación y el tiempo de procesamiento es bastante rápido. Se llama Google Mobile Vision.

La API de Barcode Scanner detecta códigos de barras en tiempo real en cualquier orientación. También puede detectar y analizar varios códigos de barras en diferentes formatos al mismo tiempo.

https://developers.google.com/vision/

https://codelabs.developers.google.com/codelabs/bar-codes/#0

Acabo de escribir un método que decodifica códigos de barra generados, Bitmap to String .

Hace exactamente lo que se solicita, solo sin CaptureActivity

Por lo tanto, uno puede omitir la biblioteca de android-integration en build.gradle :

 dependencies { // https://mvnrepository.com/artifact/com.google.zxing compile('com.google.zxing:core:3.3.0') compile('com.google.zxing:android-core:3.3.0') } 

El método como siguiente (que en realidad decodifica los códigos de barras generados, dentro de una prueba jUnit):

 import android.graphics.Bitmap; import com.google.zxing.BinaryBitmap; import com.google.zxing.LuminanceSource; import com.google.zxing.MultiFormatReader; import com.google.zxing.NotFoundException; import com.google.zxing.RGBLuminanceSource; import com.google.zxing.common.HybridBinarizer; import com.google.zxing.Result; protected String decode(Bitmap bitmap) { MultiFormatReader reader = new MultiFormatReader(); String barcode = null; int[] intArray = new int[bitmap.getWidth() * bitmap.getHeight()]; bitmap.getPixels(intArray, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight()); LuminanceSource source = new RGBLuminanceSource(bitmap.getWidth(), bitmap.getHeight(), intArray); BinaryBitmap binary = new BinaryBitmap(new HybridBinarizer(source)); try { Result result = reader.decode(binary); // BarcodeFormat format = result.getBarcodeFormat(); // ResultPoint[] points = result.getResultPoints(); // byte[] bytes = result.getRawBytes(); barcode = result.getText(); } catch (NotFoundException e) { e.printStackTrace(); } return barcode; }