How to configure a barcode scanner to read a single barcode?

Configura un Escáner de Códigos de Barras en Android con Scanbot SDK

25/03/2024

Valoración: 4.08 (2505 votos)

En el mundo actual, donde la eficiencia y la digitalización son clave, las aplicaciones móviles con capacidades de escaneo de códigos de barras se han vuelto herramientas indispensables. Desde la gestión de inventario en almacenes hasta el simple escaneo de un producto en una tienda, la habilidad de leer datos de códigos de barras y códigos QR de forma rápida y precisa es fundamental. Este artículo te guiará a través del proceso de creación de una poderosa aplicación de escaneo en Android, utilizando Kotlin y el robusto Scanbot SDK para extraer datos de códigos de barras y códigos QR de manera sencilla y efectiva. Nos centraremos en cómo configurar el escáner para leer un solo código de barras, pero también exploraremos la opción de escaneo múltiple con una superposición de Realidad Aumentada (AR).

How to configure a barcode scanner to read a single barcode?
In the onCreate() method, set up an OnClickListener for the Scan Barcodes button. When the button is clicked, it starts the barcodeResultLauncher using a configuration object. We’ll configure the scanner to read a single barcode and display a confirmation dialogue. val config = BarcodeScannerScreenConfiguration().apply {

A lo largo de esta guía, cubriremos los pasos esenciales, desde la preparación del proyecto en Android Studio hasta la implementación de la funcionalidad de escaneo, asegurándonos de que tengas una comprensión clara y práctica para construir tu propia solución.

Índice de Contenido

Introducción al Escaneo de Códigos de Barras en Android

El escaneo de códigos de barras es una funcionalidad crucial en muchas aplicaciones modernas. Permite automatizar la entrada de datos, reducir errores manuales y agilizar procesos. Implementar esta funcionalidad desde cero puede ser complejo, ya que implica manejar la cámara, procesar imágenes, reconocer patrones y decodificar la información. Aquí es donde los SDK (Kits de Desarrollo de Software) como el de Scanbot Barcode Scanner entran en juego, simplificando drásticamente el proceso y permitiendo a los desarrolladores integrar capacidades de escaneo avanzadas con solo unas pocas líneas de código.

El Scanbot SDK es una solución potente que ofrece no solo el escaneo de códigos de barras y QR, sino también otras funcionalidades como el escaneo de documentos y OCR. Para este tutorial, nos enfocaremos específicamente en su módulo de escaneo de códigos de barras, que proporciona una interfaz de usuario lista para usar (RTU UI) que puedes integrar rápidamente en tu aplicación Android.

Primeros Pasos: Preparando tu Proyecto Android

Antes de sumergirnos en la implementación del escaneo, necesitamos configurar nuestro entorno de desarrollo y añadir las dependencias necesarias.

Creación del Proyecto

Para empezar, abre Android Studio y crea un nuevo proyecto. Selecciona la plantilla 'Empty Views Activity' y asígnale un nombre, por ejemplo, 'Android Barcode Scanner'. Asegúrate de que el lenguaje seleccionado sea Kotlin.

Configuración de Dependencias del SDK

Una vez que tu proyecto esté listo, el primer paso es añadir los repositorios Maven de Scanbot SDK a tu archivo settings.gradle.kts. Esto le dice a Gradle dónde encontrar las bibliotecas del SDK.

dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
// Añade los repositorios de Scanbot aquí:
maven(url = "https://nexus.scanbot.io/nexus/content/repositories/releases/")
maven(url = "https://nexus.scanbot.io/nexus/content/repositories/snapshots/")
}
}

Luego, en el archivo app/build.gradle.kts de tu módulo de aplicación, añade las dependencias para el Scanbot SDK y la interfaz de usuario RTU (Ready-To-Use) de códigos de barras. Es importante verificar la última versión del SDK en el registro de cambios de Scanbot para asegurarte de que estás utilizando la más reciente.

dependencies {
implementation("io.scanbot:scanbot-barcode-scanner-sdk:7.1.0")
implementation("io.scanbot:rtu-ui-v2-barcode:7.1.0")
}

Después de añadir estas líneas, sincroniza tu proyecto con los archivos Gradle para descargar las nuevas dependencias.

Permisos de Cámara

Dado que nuestra aplicación necesitará acceder a la cámara del dispositivo para escanear códigos de barras, debemos declarar los permisos necesarios en el archivo AndroidManifest.xml. Esto garantiza que la aplicación pueda solicitar al usuario el acceso a la cámara y utilizarla para el escaneo.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">

<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />

<application
...
</application>
</manifest>

Inicializando el SDK de Scanbot Barcode Scanner

Antes de poder utilizar las funcionalidades del Scanbot Barcode Scanner SDK, es fundamental inicializarlo correctamente. La mejor práctica es hacerlo en una subclase de Application. Esto asegura que el SDK se inicialice una sola vez y esté disponible durante todo el ciclo de vida de la aplicación, incluso si el proceso de la aplicación se restaura después de haber sido terminado en segundo plano.

Creando la Clase Application

Para crear una subclase de Application, haz clic derecho en la carpeta de tu paquete (por ejemplo, app/kotlin+java/com.example.androidbarcodescanner), selecciona 'New' > 'Kotlin Class/File' y asígnale un nombre descriptivo, como 'ExampleApplication'.

Implementación de la Inicialización

Dentro de ExampleApplication.kt, añade las importaciones necesarias y haz que la clase extienda Application. Luego, dentro del método onCreate(), inicializa el SDK utilizando ScanbotBarcodeScannerSDKInitializer.

import android.app.Application
import io.scanbot.sdk.barcode_scanner.ScanbotBarcodeScannerSDKInitializer

class ExampleApplication: Application() {
override fun onCreate() {
super.onCreate()

ScanbotBarcodeScannerSDKInitializer()
// Opcional: descomenta la siguiente línea si tienes una clave de licencia.
// .license(this, LICENSE_KEY)
.initialize(this)
}
}

Es importante destacar que, sin una clave de licencia, el SDK de Scanbot funcionará solo por 60 segundos por sesión. Para propósitos de desarrollo y prueba, esto es suficiente. Si planeas un despliegue completo, puedes generar una clave de licencia en el sitio web de Scanbot, asegurándote de usar el applicationId correcto de tu archivo app/build.gradle.kts.

Registrando la Clase Application

Finalmente, para que Android sepa que debe usar tu subclase de Application, necesitas registrarla en el archivo AndroidManifest.xml. Añade el atributo android:name a la etiqueta <application>.

<application
android:name=".ExampleApplication"
...
</application>

Diseñando la Interfaz de Usuario Principal

Para interactuar con el escáner de códigos de barras, crearemos una interfaz de usuario rudimentaria. Para este tutorial, un simple botón será suficiente para iniciar la pantalla de escaneo.

Layout de la Pantalla Principal (activity_main.xml)

Abre el archivo app/res/layout/activity_main.xml y reemplaza su contenido con el siguiente layout, que incluye un único botón centrado:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<Button
android:id="@+id/btn_scan_barcodes"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="Scan Barcodes"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

Conexión del Botón en MainActivity.kt

Ahora, conectaremos este botón a nuestra lógica de la aplicación en MainActivity.kt, para que al hacer clic en él se inicie la pantalla de escaneo.

Implementando la Funcionalidad de Escaneo de Códigos de Barras

La parte central de nuestra aplicación es la implementación de la funcionalidad de escaneo. Aquí configuraremos el lanzamiento del escáner y cómo manejar sus resultados.

Importaciones Necesarias en MainActivity.kt

En tu archivo MainActivity.kt, añade las siguientes importaciones al inicio de la clase:

import android.widget.Button
import android.widget.Toast
import androidx.activity.result.ActivityResultLauncher
import io.scanbot.sdk.ui_v2.barcode.BarcodeScannerActivity
import io.scanbot.sdk.ui_v2.common.activity.registerForActivityResultOk
import io.scanbot.sdk.ui_v2.barcode.configuration.*

Configuración del Lanzador de Escáner (barcodeResultLauncher)

Dentro de la clase MainActivity, pero fuera del método onCreate(), define una propiedad privada barcodeResultLauncher. Esta propiedad será la encargada de lanzar la actividad del escáner y manejar el resultado del escaneo. El resultado se mostrará como un mensaje Toast en la pantalla.

How to integrate zxing for barcode or QR scanning?
Easiest way to integrate ZXing for barcode or Qr scanning. Add in dependencies ScanActivity import android.os.Bundle; import android.util.Log; import com.google.zxing.Result; import me.dm7.barcodescanner.zxing.ZXingScannerView; public class ScanActivity extends AppCompatActivity implements ZXingScannerView.ResultHandler{
class MainActivity: AppCompatActivity() {

private val barcodeResultLauncher: ActivityResultLauncher<BarcodeScannerScreenConfiguration> =
registerForActivityResultOk(BarcodeScannerActivity.ResultContract()) { resultEntity ->
// Callback del resultado del escáner de códigos de barras:
// Obtener el primer código de barras escaneado del objeto de resultado...
val barcodeItem = resultEntity.result?.items?.first()

// ... y procesar el resultado según sea necesario. Por ejemplo, mostrar como un Toast:
Toast.makeText(
this,
"Scanned: ${barcodeItem?.barcode?.text} (${barcodeItem?.barcode?.format})",
Toast.LENGTH_LONG
).show()
}

Esta configuración es clave para el escaneo único, ya que toma el primer elemento escaneado y lo procesa.

Configuración para Escaneo Único

Dentro del método onCreate(), configura el OnClickListener para el botón 'Scan Barcodes'. Cuando se haga clic, el lanzador del escáner se iniciará con un objeto de configuración que especifica el modo de escaneo único y habilita una hoja de confirmación para el usuario.

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContentView(R.layout.activity_main)
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets
}

findViewById<Button>(R.id.btn_scan_barcodes).setOnClickListener {
val config = BarcodeScannerScreenConfiguration().apply {
// Inicializar el caso de uso para escaneo único.
this.useCase = SingleScanningMode().apply {
// Habilitar y configurar la hoja de confirmación.
this.confirmationSheetEnabled = true
}
}
barcodeResultLauncher.launch(config)
}
}

¡Ahora puedes construir y ejecutar la aplicación para probar tu escáner de escaneo único!

Escaneo Múltiple Opcional con Superposición AR

Aunque nos hemos centrado en el escaneo único, el Scanbot SDK también permite el escaneo de múltiples códigos de barras a la vez. Además, puedes añadir una superposición de Realidad Aumentada (AR) que muestra los valores de los códigos de barras directamente en la pantalla de escaneo. Los usuarios pueden tocar los códigos de barras para añadirlos a una hoja de resultados.

Para habilitar esta funcionalidad, simplemente reemplaza la configuración de escaneo único con la configuración de escaneo múltiple y habilita la superposición AR en tu OnClickListener:

findViewById<Button>(R.id.btn_scan_barcodes).setOnClickListener {
val config = BarcodeScannerScreenConfiguration().apply {
// Inicializar el caso de uso para escaneo múltiple.
this.useCase = MultipleScanningMode().apply {
// Habilitar la superposición AR y permitir a los usuarios seleccionar códigos de barras.
this.arOverlay.visible = true
this.arOverlay.automaticSelectionEnabled = false
}
}
barcodeResultLauncher.launch(config)
}

Tu archivo MainActivity.kt final, incluyendo la configuración de escaneo múltiple, se verá así:

package com.example.androidbarcodescanner

import android.os.Bundle
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import android.widget.Button
import android.widget.Toast
import androidx.activity.result.ActivityResultLauncher
import io.scanbot.sdk.ui_v2.barcode.BarcodeScannerActivity
import io.scanbot.sdk.ui_v2.common.activity.registerForActivityResultOk
import io.scanbot.sdk.ui_v2.barcode.configuration.*

class MainActivity: AppCompatActivity() {

private val barcodeResultLauncher: ActivityResultLauncher<BarcodeScannerScreenConfiguration> = registerForActivityResultOk(BarcodeScannerActivity.ResultContract()) { resultEntity ->
// Barcode Scanner result callback:
// Get the first scanned barcode from the result object...
val barcodeItem = resultEntity.result?.items?.first()

// ... and process the result as needed. For example, display as a Toast:
Toast.makeText(
this,
"Scanned: ${barcodeItem?.barcode?.text} (${barcodeItem?.barcode?.format})",
Toast.LENGTH_LONG
).show()
}

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContentView(R.layout.activity_main)
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets
}

findViewById<Button>(R.id.btn_scan_barcodes).setOnClickListener {
val config = BarcodeScannerScreenConfiguration().apply {
// Initialize the use case for multi-scanning.
this.useCase = MultipleScanningMode().apply {
// Enable the AR overlay and let users select barcodes.
this.arOverlay.visible = true
this.arOverlay.automaticSelectionEnabled = false
}
}
barcodeResultLauncher.launch(config)
}
}
}

¡Construye y ejecuta la aplicación nuevamente para probar tu escáner de códigos de barras múltiples! Si necesitas códigos de barras para probar, puedes encontrarlos fácilmente en línea o imprimir algunos.

Elevando tu Aplicación: Temas Avanzados y Mejores Prácticas

Ahora que has integrado con éxito el Scanbot Android Barcode Scanner SDK en tu aplicación, es momento de explorar temas avanzados que te ayudarán a construir una experiencia de escaneo de códigos de barras robusta, de alto rendimiento y fácil de usar. Estas consideraciones van más allá de la configuración fundamental y se adentran en la optimización de tu aplicación para diversos escenarios del mundo real.

Manejo Robusto de Errores y Orientación al Usuario

Incluso en condiciones ideales, pueden ocurrir errores. Una aplicación bien diseñada anticipa estos problemas y guía al usuario de manera efectiva. Implementa un manejo integral de errores para escenarios comunes como la denegación de permisos de cámara, explicando claramente por qué se necesita el permiso y proporcionando una ruta directa para otorgarlo. Aborda los problemas de hardware donde la cámara no está disponible o funciona mal, ofreciendo información de diagnóstico si es posible. Informa al usuario cuando se escanea un tipo de código de barras no compatible y proporciona retroalimentación clara y sugerencias para condiciones de poca luz (por ejemplo, "Muévase a un área más brillante" o "Encienda la linterna"). El objetivo es una guía de usuario accionable en lugar de mensajes de error genéricos.

Optimización del Consumo de Batería

El uso continuo de la cámara puede agotar significativamente la vida útil de la batería. Optimiza tu aplicación gestionando eficientemente el ciclo de vida de la sesión de la cámara, iniciándola y deteniéndola solo cuando se escanea activamente y liberando los recursos de la cámara inmediatamente cuando no se utilizan. Además, optimiza la tasa de procesamiento de fotogramas de vista previa, minimizándola si no se requiere un escaneo de alta velocidad de forma continua, lo que ayuda a reducir la carga de la CPU y la GPU. La eficiencia energética es clave para una buena experiencia de usuario.

Implicaciones de Seguridad de los Datos Escaneados

Los datos escaneados, especialmente de documentos sensibles o información personal, requieren un manejo cuidadoso. Implementa rutinas rigurosas de validación y sanitización para todos los datos escaneados para evitar ataques de inyección o comportamientos inesperados. Si estás escaneando URL u otro contenido potencialmente malicioso, advierte a los usuarios sobre contenido inseguro antes de que interactúen con él. Para información sensible (por ejemplo, de tarjetas de identificación), asegura un manejo seguro de los datos cifrándolos en reposo y en tránsito, adhiriéndote a las regulaciones de privacidad de datos relevantes como GDPR o CCPA. La seguridad de datos no es opcional.

Capacidades Offline y Sincronización de Datos

La conectividad de red no siempre está garantizada. Diseña tu aplicación para que funcione de manera fiable sin conexión. Implementa mecanismos para el almacenamiento offline de datos escaneados cuando no haya conexión a Internet. Luego, desarrolla estrategias robustas para sincronizar estos datos offline con tu sistema backend una vez que se restablezca la conectividad, manejando cuidadosamente los conflictos y asegurando la integridad de los datos. La capacidad de funcionamiento offline mejora la robustez de la aplicación.

Accesibilidad para Todos los Usuarios

Asegúrate de que tu aplicación de escaneo de códigos de barras sea utilizable por personas con diversas capacidades. Proporciona orientación por voz y señales de audio para usuarios con discapacidad visual para ayudarles a apuntar y posicionar el código de barras. Asegúrate de que todos los elementos de la interfaz de usuario estén correctamente etiquetados y sean compatibles con lectores de pantalla. Ofrece opciones para que los usuarios ajusten el tamaño de la fuente, el contraste y otros elementos de la interfaz de usuario para elementos ajustables de la interfaz de usuario, y proporciona modos de alto contraste para mejorar la legibilidad para usuarios con baja visión. La inclusión digital es un pilar fundamental.

Estrategias de Pruebas Exhaustivas

Las pruebas exhaustivas son esenciales para una aplicación de escaneo de códigos de barras fiable. Realiza pruebas unitarias en la lógica de resultados de escaneo para asegurar un análisis y una extracción de datos correctos. Realiza pruebas de integración con datos de cámara simulados para simular diversas condiciones de escaneo, lo que te permite probar cómo tu aplicación maneja diferentes tipos de códigos de barras, calidad y factores ambientales. Finalmente, realiza pruebas de interfaz de usuario para verificar el comportamiento y la capacidad de respuesta de la interfaz de tu escáner en diferentes dispositivos y versiones de Android. La calidad del software depende de un buen plan de pruebas.

Preguntas Frecuentes (FAQ)

¿Necesito una clave de licencia para el SDK de Scanbot?

Para propósitos de desarrollo y prueba, el SDK funciona durante 60 segundos por sesión sin una clave de licencia. Para un uso ilimitado y despliegues en producción, sí, necesitarás una clave de licencia. Puedes obtener una en el sitio web de Scanbot, asegurándote de asociarla con el ID de tu aplicación Android.

¿Puedo escanear múltiples códigos de barras a la vez?

¡Absolutamente! Como se mostró en la sección de implementación, el Scanbot SDK permite cambiar fácilmente entre el modo de escaneo único y el modo de escaneo múltiple (MultipleScanningMode). Este último incluso puede incluir una superposición de Realidad Aumentada para una mejor experiencia de usuario.

¿Cómo puedo resolver errores de Gradle como "Failed to find"?

Si te encuentras con errores en Gradle como "Failed to find: com.google.zxing:core" o similares, a menudo la solución es simple: deshabilitar la opción 'Offline Work' en la configuración de Gradle de Android Studio. Esto permite a Gradle descargar las dependencias necesarias de los repositorios remotos.

¿Es posible personalizar la interfaz de usuario del escáner?

Sí, el Scanbot SDK, especialmente a través de su RTU UI (Ready-To-Use User Interface), ofrece amplias opciones de personalización. Puedes modificar colores, textos, comportamientos y otros elementos visuales para que la interfaz del escáner se adapte perfectamente al diseño de tu aplicación.

¿Qué tipos de códigos de barras soporta Scanbot SDK?

El Scanbot SDK soporta una amplia gama de tipos de códigos de barras 1D y 2D, incluyendo los más comunes como QR Code, Data Matrix, Aztec, PDF417, EAN-13, UPC-A, Code 39, Code 128, y muchos más. Esto lo hace versátil para diversas aplicaciones y sectores.

Conclusión

¡Felicidades! Has construido una potente aplicación de escaneo de códigos de barras para Android con solo unas pocas líneas de código Kotlin y el Scanbot SDK. Hemos cubierto desde la configuración inicial del proyecto y la inicialización del SDK hasta la implementación de las funcionalidades de escaneo único y múltiple, incluyendo la integración de una superposición AR para una experiencia de usuario mejorada.

Esta guía es solo el punto de partida. El Scanbot SDK ofrece muchas más configuraciones y posibilidades. Te animamos a explorar la documentación de la RTU UI y las referencias de la API para descubrir todo su potencial y personalizar aún más tu aplicación. Si tienes preguntas o encuentras algún problema, el equipo de soporte de Scanbot está disponible para ayudarte.

¡Feliz escaneo! 🤳

Si quieres conocer otros artículos parecidos a Configura un Escáner de Códigos de Barras en Android con Scanbot SDK puedes visitar la categoría Librerías.

Subir