Barcode Scanning es una tecnología para leer y decodificar códigos de barras usando la cámara de un dispositivo móvil. A diferencia de los escáneres láser que requieren equipo especializado, los escáneres de cámara funcionan en cualquier smartphone con cámara. En el desarrollo móvil, Barcode Scanning se implementa a través de ML Kit Barcode Scanning (Google), AVFoundation (Apple), ZXing (open-source) o Scandit (SDK comercial). Según Google ML Kit, 2025, la biblioteca procesa más de 2 mil millones de escaneos por día con un 98.5% de precisión.
Puntos clave
Barcode Scanning es el proceso de reconocimiento óptico de códigos de barras mediante una cámara. El algoritmo captura una imagen, encuentra el código (localización), lo decodifica (extracción de datos) y devuelve un valor de cadena. Los SDK modernos escanean códigos de cualquier orientación, tamaño e iluminación — el usuario solo necesita apuntar la cámara.
Formatos de códigos de barras se dividen en dos grupos: 1D (lineales) — EAN-13, UPC-A, Code 128, Code 39, ITF, Codabar — contienen hasta 20–30 caracteres, se usan para productos y logística; 2D (matriciales) — QR Code, Data Matrix, PDF417, Aztec — contienen hasta más de 3000 caracteres, se usan para enlaces, boletos, documentos. ML Kit admite 14 formatos — todos los formatos 1D y 2D comunes.
Data Matrix es un código 2D similar a QR pero más compacto. Se utiliza en la industria (marcado de piezas), boletos electrónicos (IATA BCBP), muestras médicas. Data Matrix puede contener hasta 2335 caracteres y se imprime en superficies muy pequeñas — hasta 2x2 mm. A diferencia de QR, Data Matrix no tiene patrones de localización (cuadrados en las esquinas) y requiere una calibración de cámara más precisa.
| Formato | Tipo | Datos máx. | Aplicación |
|---|---|---|---|
| EAN-13 | 1D | 13 dígitos | Productos minoristas |
| QR Code | 2D | 4296 caracteres | Enlaces, pagos, boletos |
| Data Matrix | 2D | 2335 caracteres | Industria, medicina |
| PDF417 | 2D | 2710 caracteres | Documentos, tarjetas de embarque |
| Code 128 | 1D | 80 caracteres | Logística, transporte |
QR Code es el formato 2D más popular en aplicaciones móviles. Contiene URL, texto, vCard, configuración WiFi, información de pago (UPI, SBP). QR Code tiene 40 versiones (de 21x21 a 177x177 módulos) y 4 niveles de corrección de errores (L: 7%, M: 15%, Q: 25%, H: 30%). Para aplicaciones móviles use la versión 2–10 (25x25 – 57x57 módulos) — el equilibrio óptimo entre tamaño y datos.
ML Kit Barcode Scanning es el SDK principal para aplicaciones Android. ML Kit encuentra automáticamente todos los códigos en la imagen (a diferencia de ZXing que requiere que el código esté en el centro). La API devuelve un objeto Barcode con rawValue (contenido de texto), format (tipo de código), boundingBox y cornerPoints (4 puntos de las esquinas del código). ML Kit admite single-scan (un fotograma) y continuous-scan (flujo de video).
Modo multi-código — ML Kit puede detectar múltiples códigos en una sola imagen. Actívelo mediante BarcodeScannerOptions.Builder(). En modo múltiple se devuelve una lista de Barcodes. Úselo para inventario (escaneo de lotes de productos), reconocimiento de múltiples códigos QR en una mesa. El multi-código está desactivado por defecto — actívelo solo si es necesario, ya que ralentiza el escaneo entre un 20 y un 30%.
// ML Kit Barcode Scanning multi-code mode
val options = BarcodeScannerOptions.Builder()
.setBarcodeFormats(
Barcode.FORMAT_QR_CODE,
Barcode.FORMAT_EAN_13,
Barcode.FORMAT_DATA_MATRIX
)
.enableAllPotentialBarcodes()
.build()
val scanner = BarcodeScanning.getClient(options)
scanner.process(inputImage)
.addOnSuccessListener { barcodes ->
barcodes.forEach { barcode ->
val type = barcode.valueType // URL, TEXT, PHONE...
val rawValue = barcode.rawValue
val displayValue = barcode.displayValue
}
}
Filtrado de formatos — optimización obligatoria. setBarcodeFormats() limita los formatos que ML Kit buscará. Si la aplicación escanea solo códigos QR — especifique FORMAT_QR_CODE. Esto acelera el escaneo de 2 a 3 veces al excluir algoritmos de decodificación de otros formatos. Para escáneres minoristas — FORMAT_EAN_13 | FORMAT_UPC_A. Para logística — FORMAT_CODE_128 | FORMAT_CODE_39 | FORMAT_PDF417.
ZXing (Zebra Crossing) es una biblioteca open-source en Java (Android) con versiones para Swift, React Native, Flutter. ZXing fue el estándar de facto para escaneo antes de ML Kit. Admite todos los formatos populares, funciona en cualquier dispositivo (incluido Huawei sin Google Play) y no requiere Google Play Services. Desventajas: 2–3 veces más lento que ML Kit, no encuentra códigos en los bordes del marco, no tiene multi-código.
ML Kit vs ZXing — ML Kit gana en velocidad, precisión y UX. ML Kit detecta un código incluso si ocupa el 10% del marco y está en una esquina. ZXing requiere que el código ocupe el 50–80% del marco y esté en el centro. ML Kit usa una red neuronal (MobileNetV2-SSD) para localizar el código, ZXing usa binarización clásica y búsqueda de patrones de localización. Según Google (2025), ML Kit alcanza un 98.5% de precisión frente al 92% de ZXing.
| Característica | ML Kit | ZXing |
|---|---|---|
| Precisión | 98.5% | 92% |
| Velocidad | 15–30 ms | 50–150 ms |
| Multi-código | Sí | No |
| Google Play | Requerido | No requerido |
| Código en esquina | Detecta | No detecta |
Cuándo elegir ZXing: si la aplicación debe funcionar en dispositivos Huawei (sin Google Play Services), en Android Go (memoria limitada), o si se necesita operación completamente offline sin Play Services. Para todos los demás casos — ML Kit es más rápido, más preciso, más fácil de integrar y ofrece una mejor UX gracias al multi-código y la detección en bordes.
// ZXing Core: simple scanner
val reader = MultiFormatReader()
val bitmap = BitmapFactory.decodeResource(resources, R.drawable.test)
val source = RGBLuminanceSource(bitmap)
val binarizer = HybridBinarizer(source)
val binaryBitmap = BinaryBitmap(binarizer)
try {
val result = reader.decode(binaryBitmap)
Log.d("ZXing", result.text)
} catch (e: NotFoundException) {
// Code not found
}
Scandit como alternativa — un SDK comercial con 99.5% de precisión y velocidad de 10–20 ms. Usa redes neuronales propias y no requiere Google Play Services. Precio — desde $400/mes (2019). Scandit domina en retail y logística (Walmart, FedEx). Para la mayoría de aplicaciones móviles ML Kit es suficiente — Scandit se justifica solo para tareas empresariales con escaneo de alto volumen.
Apple AVFoundation proporciona Barcode Scanning nativo a través de AVCaptureMetadataOutput. Desde iOS 7, AVFoundation admite escaneo de códigos QR, y desde iOS 8 — todos los formatos EAN, UPC, Code 128, PDF417. AVFoundation no requiere SDK adicionales — es parte de Foundation. El escaneo funciona a través de Apple Neural Engine en A12+ — velocidad de 10–20 ms con consumo mínimo de energía.
Ventajas de AVFoundation: cero dependencias, manejo automático de orientación de cámara, soporte integrado de modo claro/oscuro, funcionamiento en segundo plano (con background modes). AVFoundation ajusta automáticamente el enfoque y la exposición para el escaneo — el desarrollador solo necesita suscribirse al delegado captureOutput. Desventaja: menos configuraciones que ML Kit — no se puede activar multi-código ni filtrado de formatos.
import AVFoundation
class BarcodeScannerController: UIViewController, AVCaptureMetadataOutputObjectsDelegate {
private var captureSession: AVCaptureSession!
override func viewDidLoad() {
let metadataOutput = AVCaptureMetadataOutput()
captureSession.addOutput(metadataOutput)
metadataOutput.setMetadataObjectsDelegate(self, queue: .main)
metadataOutput.metadataObjectTypes = [.qr, .ean13, .code128]
}
func metadataOutput(_ output: AVCaptureMetadataOutput,
didOutput objects: [AVMetadataObject],
from connection: AVCaptureConnection) {
guard let code = objects.first as? AVMetadataMachineReadableCodeObject else { return }
print(code.stringValue ?? "")
}
}
ML Kit vs AVFoundation en iOS: ML Kit ofrece más control — se pueden configurar formatos, activar multi-código, filtrar códigos por confianza. AVFoundation es más rápido en dispositivos antiguos (menos sobrecarga), pero no admite Data Matrix, Aztec, PDF417 en iOS < 15. Para iOS 15+ ML Kit es preferible. Para iOS 12–14 use AVFoundation + respaldo a ML Kit para formatos no soportados.
Scandit es un SDK comercial para Barcode Scanning enfocado en retail, logística y salud. Scandit usa redes neuronales propias entrenadas con más de 10 millones de imágenes de códigos de barras en diversas condiciones: reflejos, daños, poca luz, inclinación hasta 45°, reflejos. Scandit escanea códigos a distancias de hasta 15 metros (para PDF417 en almacenes) y en superficies curvas (latas, botellas).
Funcionalidades de Scandit: SparkScan (escaneo único para escaneo secuencial rápido), MatrixScan (multi-código + resaltado AR de elementos escaneados), PickList (búsqueda de producto por código de barras con confirmación). Scandit admite más de 50 formatos, incluidos GS1 DataBar y Composite Codes. Velocidad — 10–15 ms por código. Precisión — 99.5% con iluminación estándar, 97% con poca luz.
// Scandit MatrixScan (SDK license required)
val barcodeTracking = BarcodeTracking
.forDataCaptureContext(context)
.addListener(this)
.build()
barcodeTracking.addSessionListener { session, _ ->
session.trackedBarcodes.forEach { (trackingId, barcode) ->
val data = barcode.data
val symbolCount = barcode.symbolCount
}
}
Scandit vs ML Kit: Scandit es de pago ($400+/mes), pero ofrece funciones empresariales: SparkScan (botón de hardware en dispositivos corporativos), MatrixScan (superposición AR para resaltar), PickList (confirmación por voz). ML Kit es gratuito y suficiente para el 90% de las aplicaciones móviles: escáneres de tiendas, lectores QR, aplicaciones de boletos. Scandit se justifica solo para terminales logísticas con dispositivos Zebra/Honeywell.
Optimización de Barcode Scanning incluye configuración de cámara, resolución y SDK. La regla principal: menos píxeles — escaneo más rápido. Para ML Kit la resolución óptima es 480p (640x480) para video y 720p (1280x720) para fotos. Aumentar a 1080p ralentiza el procesamiento de 2 a 3 veces sin mejora de precisión. Use CameraX con ImageAnalysis para gestión automática de resolución.
Enfoque y exposición son críticos para la calidad del escaneo. ML Kit no configura la cámara automáticamente — el desarrollador debe activar el enfoque automático continuo y la exposición automática continua a través de Camera2 o CameraX. Sin enfoque automático, los códigos borrosos reducen la precisión al 60–70%. Para escaneo de cerca (5–15 cm) use el modo macro de la cámara si está disponible.
Auto-zoom y superposición de localización — mejoras de UX para el usuario. El auto-zoom acerca el código cuando se detecta (como en la cámara de Google Lens). Se implementa analizando el boundingBox del código y escalando la vista previa. La superposición de localización es un marco gráfico que muestra hacia dónde apuntar la cámara. Para una mejor UX, muestre el boundingBox del código encontrado y resáltelo en verde al decodificarlo exitosamente.
// CameraX + ML Kit: optimized scanner
class BarcodeAnalyzer(private val scanner: BarcodeScanner) :
ImageAnalysis.Analyzer {
override fun analyze(image: ImageProxy) {
if (image.image == null) { image.close(); return }
val mediaImage = InputImage.fromMediaImage(image.image, image.imageInfo.rotationDegrees)
scanner.process(mediaImage)
.addOnSuccessListener { barcodes ->
barcodes.firstOrNull()?.let {
// Haptic + sound + code highlight
}
}
.addOnCompleteListener { image.close() }
}
}
Retroalimentación al usuario: vibración (HapticFeedback), sonido (MediaActionSound), resaltado visual (Canvas/Overlay). Después de un escaneo exitoso, agregue una demora de 1000–1500 ms (limitación) antes del siguiente escaneo — esto evita disparos duplicados en el mismo código. Para escaneo secuencial (escaneo de lotes) use el enfoque SparkScan: cada escaneo se registra y se anuncia, con una demora de 300–500 ms.
Preguntas frecuentes
ML Kit Barcode Scanning es la mejor opción para Android: gratuito, 98.5% de precisión, multi-código, detección en cualquier parte del marco. Si la aplicación debe funcionar en dispositivos Huawei sin Google Play — use ZXing (open-source, menor precisión). Para logística empresarial — Scandit (de pago, 99.5% de precisión, SparkScan). Para un lector QR simple, ZXing o ML Kit son suficientes.
ML Kit Barcode Scanning admite 14 formatos: 1D — EAN-8, EAN-13, UPC-A, UPC-E, Code 39, Code 93, Code 128, ITF, Codabar; 2D — QR Code, Data Matrix, PDF417, Aztec. También se admite GS1 DataBar (RSS-14, RSS-Expanded). La lista completa está en la documentación de Barcode.FORMAT_*. Para limitar formatos use setBarcodeFormats() — esto acelera el escaneo de 2 a 3 veces.
Reduzca la resolución de la cámara a 480p (640x480), active el enfoque automático continuo, limite los formatos a los necesarios (setBarcodeFormats), use el modo de rendimiento FAST. Para ML Kit especifique solo los formatos necesarios — excluir formatos adicionales acelera el escaneo de 2 a 3 veces. Para ZXing — use HybridBinarizer en lugar de GlobalHistogramBinarizer (20% más rápido). Para AVFoundation — especifique metadataObjectTypes.
Sí, todos los SDK locales de Barcode Scanning (ML Kit, ZXing, AVFoundation, Scandit) funcionan completamente offline. ML Kit requiere internet solo para la descarga inicial del modelo (modo descargado), después el modelo se almacena en caché en el dispositivo. AVFoundation está integrado en iOS, no requiere internet. ZXing es completamente offline sin Play Services. El escaneo en la nube (Google Cloud Vision) no se usa en aplicaciones móviles.
ML Kit y Scandit tienen corrección integrada para códigos dañados gracias a algoritmos de redes neuronales. ML Kit restaura hasta el 30% de un código dañado (rayones, roturas). Scandit — hasta el 50% gracias al entrenamiento con códigos defectuosos. ZXing prácticamente no restaura códigos dañados — requiere una imagen nítida. Para escanear códigos defectuosos use Scandit o ML Kit con el modo de rendimiento ACCURATE.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también