Digitalização de códigos de barras em aplicações — tipos de códigos e ML Kit

Autor: IT Sectr Publicado: 2026-07-18 Tempo de leitura: 10 min

Barcode Scanning é uma tecnologia de leitura e descodificação de códigos de barras usando a câmara de um dispositivo móvel. Ao contrário dos scanners laser que requerem equipamento especializado, os scanners de câmara funcionam em qualquer smartphone com câmara. No desenvolvimento móvel, o Barcode Scanning é implementado através do ML Kit Barcode Scanning (Google), AVFoundation (Apple), ZXing (open-source) ou Scandit (SDK comercial). De acordo com Google ML Kit, 2025, a biblioteca processa mais de 2 mil milhões de digitalizações por dia com 98.5% de precisão.

Principais pontos

  • Barcode Scanning — leitura de códigos 1D e 2D com a câmara
  • ML Kit Barcode — o SDK mais preciso (98.5%), multi-código, todos os formatos
  • Formatos — EAN, UPC, QR, Data Matrix, PDF417, Aztec, Code 128
  • Tempo real — digitalização até 60 FPS com CameraX e AVFoundation
  • No dispositivo — todo o processamento local, sem internet

O que é Barcode Scanning: princípios e formatos

Barcode Scanning é o processo de reconhecimento ótico de códigos de barras usando uma câmara. O algoritmo captura uma imagem, encontra o código (localização), descodifica-o (extração de dados) e devolve um valor de string. Os SDKs modernos digitalizam códigos de qualquer orientação, tamanho e iluminação — o utilizador só precisa de apontar a câmara.

Formatos de códigos de barras dividem-se em dois grupos: 1D (lineares) — EAN-13, UPC-A, Code 128, Code 39, ITF, Codabar — contêm até 20–30 caracteres, usados para produtos e logística; 2D (matriciais) — QR Code, Data Matrix, PDF417, Aztec — contêm até mais de 3000 caracteres, usados para links, bilhetes, documentos. O ML Kit suporta 14 formatos — todos os formatos 1D e 2D comuns.

Data Matrix é um código 2D semelhante ao QR mas mais compacto. É utilizado na indústria (marcação de peças), bilhetes eletrónicos (IATA BCBP), amostras médicas. O Data Matrix pode conter até 2335 caracteres e pode ser impresso em superfícies muito pequenas — até 2x2 mm. Ao contrário do QR, o Data Matrix não tem padrões de localização (quadrados nos cantos) e requer uma calibração de câmara mais precisa.

FormatoTipoDados máx.Aplicação
EAN-131D13 dígitosProdutos de retalho
QR Code2D4296 caracteresLinks, pagamentos, bilhetes
Data Matrix2D2335 caracteresIndústria, medicina
PDF4172D2710 caracteresDocumentos, cartões de embarque
Code 1281D80 caracteresLogística, transporte

QR Code é o formato 2D mais popular em aplicações móveis. Contém URL, texto, vCard, configuração WiFi, informação de pagamento (UPI, SBP). O QR Code tem 40 versões (de 21x21 a 177x177 módulos) e 4 níveis de correção de erros (L: 7%, M: 15%, Q: 25%, H: 30%). Para aplicações móveis use a versão 2–10 (25x25 – 57x57 módulos) — o equilíbrio ideal entre tamanho e dados.

ML Kit Barcode Scanning: integração e configuração

ML Kit Barcode Scanning é o SDK principal para aplicações Android. O ML Kit encontra automaticamente todos os códigos na imagem (ao contrário do ZXing que requer que o código esteja no centro). A API devolve um objeto Barcode com rawValue (conteúdo de texto), format (tipo de código), boundingBox e cornerPoints (4 pontos dos cantos do código). O ML Kit suporta single-scan (um fotograma) e continuous-scan (fluxo de vídeo).

Modo multi-código — o ML Kit pode detetar vários códigos numa única imagem. Ative através de BarcodeScannerOptions.Builder(). No modo múltiplo é devolvida uma lista de Barcodes. Use para inventário (digitalização de lotes de produtos), reconhecimento de múltiplos códigos QR numa mesa. O multi-código está desativado por predefinição — ative apenas se necessário, pois retarda a digitalização em 20–30%.

kotlin
// 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
        }
    }

Filtragem de formatos — otimização obrigatória. setBarcodeFormats() limita os formatos que o ML Kit irá procurar. Se a aplicação digitaliza apenas códigos QR — especifique FORMAT_QR_CODE. Isto acelera a digitalização 2–3 vezes ao excluir algoritmos de descodificação de outros formatos. Para scanners de retalho — FORMAT_EAN_13 | FORMAT_UPC_A. Para logística — FORMAT_CODE_128 | FORMAT_CODE_39 | FORMAT_PDF417.

ZXing vs ML Kit: comparação de bibliotecas

ZXing (Zebra Crossing) é uma biblioteca open-source em Java (Android) com portes para Swift, React Native, Flutter. O ZXing foi o padrão de facto para digitalização antes do ML Kit. Suporta todos os formatos populares, funciona em qualquer dispositivo (incluindo Huawei sem Google Play) e não requer Google Play Services. Desvantagens: 2–3 vezes mais lento que o ML Kit, não encontra códigos nas bordas do enquadramento, não tem multi-código.

ML Kit vs ZXing — o ML Kit ganha em velocidade, precisão e UX. O ML Kit deteta um código mesmo que ocupe 10% do enquadramento e esteja num canto. O ZXing requer que o código ocupe 50–80% do enquadramento e esteja no centro. O ML Kit usa uma rede neuronal (MobileNetV2-SSD) para localizar o código, o ZXing usa binarização clássica e pesquisa de padrões de localização. Segundo a Google (2025), o ML Kit atinge 98.5% de precisão contra 92% do ZXing.

CaracterísticaML KitZXing
Precisão98.5%92%
Velocidade15–30 ms50–150 ms
Multi-códigoSimNão
Google PlayRequeridoNão requerido
Código no cantoDetetaNão deteta

Quando escolher o ZXing: se a aplicação precisar de funcionar em dispositivos Huawei (sem Google Play Services), em Android Go (memória limitada), ou se for necessário funcionamento totalmente offline sem Play Services. Para todos os outros casos — o ML Kit é mais rápido, mais preciso, mais fácil de integrar e oferece uma melhor UX graças ao multi-código e deteção nas bordas.

kotlin
// 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 — um SDK comercial com 99.5% de precisão e velocidade de 10–20 ms. Usa redes neuronais próprias e não requer Google Play Services. Preço — a partir de $400/mês (2019). A Scandit domina no retalho e logística (Walmart, FedEx). Para a maioria das aplicações móveis o ML Kit é suficiente — a Scandit justifica-se apenas para tarefas empresariais com digitalização de alto volume.

Apple AVFoundation: scanner nativo no iOS

Apple AVFoundation fornece Barcode Scanning nativo através de AVCaptureMetadataOutput. Desde o iOS 7, o AVFoundation suporta digitalização de códigos QR, e desde o iOS 8 — todos os formatos EAN, UPC, Code 128, PDF417. O AVFoundation não requer SDKs adicionais — faz parte da Foundation. A digitalização funciona através do Apple Neural Engine em A12+ — velocidade de 10–20 ms com consumo mínimo de energia.

Vantagens do AVFoundation: zero dependências, tratamento automático da orientação da câmara, suporte integrado de modo claro/escuro, funcionamento em segundo plano (com background modes). O AVFoundation ajusta automaticamente a focagem e exposição para a digitalização — o programador só precisa de subscrever o delegado captureOutput. Desvantagem: menos configurações que o ML Kit — não é possível ativar multi-código ou filtragem de formatos.

swift
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 no iOS: o ML Kit dá mais controlo — pode configurar formatos, ativar multi-código, filtrar códigos por confiança. O AVFoundation é mais rápido em dispositivos antigos (menos sobrecarga), mas não suporta Data Matrix, Aztec, PDF417 em iOS < 15. Para iOS 15+ o ML Kit é preferível. Para iOS 12–14 use AVFoundation + recurso ao ML Kit para formatos não suportados.

Scandit: solução comercial para empresas

Scandit é um SDK comercial para Barcode Scanning focado no retalho, logística e saúde. A Scandit usa redes neuronais próprias treinadas com mais de 10 milhões de imagens de códigos de barras em diversas condições: reflexos, danos, pouca luz, inclinação até 45°, reflexos. A Scandit digitaliza códigos a distâncias até 15 metros (para PDF417 em armazéns) e em superfícies curvas (latas, garrafas).

Funcionalidades da Scandit: SparkScan (digitalização única para digitalização sequencial rápida), MatrixScan (multi-código + realce AR de itens digitalizados), PickList (pesquisa de produto por código de barras com confirmação). A Scandit suporta mais de 50 formatos, incluindo GS1 DataBar e Composite Codes. Velocidade — 10–15 ms por código. Precisão — 99.5% com iluminação padrão, 97% com pouca luz.

kotlin
// 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: a Scandit é paga ($400+/mês), mas oferece funcionalidades empresariais: SparkScan (botão de hardware em dispositivos corporativos), MatrixScan (sobreposição AR para realce), PickList (confirmação por voz). O ML Kit é gratuito e suficiente para 90% das aplicações móveis: scanners de lojas, leitores QR, aplicações de bilhetes. A Scandit justifica-se apenas para terminais logísticos com dispositivos Zebra/Honeywell.

Otimização da digitalização: velocidade e precisão

Otimização do Barcode Scanning inclui configurações de câmara, resolução e SDK. A regra principal: menos píxeis — digitalização mais rápida. Para o ML Kit a resolução ideal é 480p (640x480) para vídeo e 720p (1280x720) para fotos. Aumentar para 1080p retarda o processamento 2–3 vezes sem melhoria de precisão. Use CameraX com ImageAnalysis para gestão automática de resolução.

Foco e exposição são críticos para a qualidade da digitalização. O ML Kit não configura a câmara automaticamente — o programador deve ativar o foco automático contínuo e a exposição automática contínua através de Camera2 ou CameraX. Sem focagem automática, os códigos desfocados reduzem a precisão para 60–70%. Para digitalização de perto (5–15 cm) use o modo macro da câmara se disponível.

Auto-zoom e sobreposição de localização — melhorias de UX para o utilizador. O auto-zoom aproxima o código quando detetado (como na câmara do Google Lens). Implementa-se analisando o boundingBox do código e escalando a pré-visualização. A sobreposição de localização é uma moldura gráfica que mostra para onde apontar a câmara. Para melhor UX, mostre o boundingBox do código encontrado e realce-o a verde quando descodificado com sucesso.

kotlin
// 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() }
    }
}

Feedback ao utilizador: vibração (HapticFeedback), som (MediaActionSound), realce visual (Canvas/Overlay). Após uma digitalização bem-sucedida, adicione um atraso de 1000–1500 ms (limitação) antes da próxima digitalização — isto evita acionamentos duplicados no mesmo código. Para digitalização sequencial (digitalização de lotes) use a abordagem SparkScan: cada digitalização é registada e anunciada, com um atraso de 300–500 ms.

Perguntas frequentes

Qual o melhor SDK para digitalizar códigos de barras no Android?

ML Kit Barcode Scanning é a melhor escolha para Android: gratuito, 98.5% de precisão, multi-código, deteção em qualquer parte do enquadramento. Se a aplicação precisar de funcionar em dispositivos Huawei sem Google Play — use ZXing (open-source, menor precisão). Para logística empresarial — Scandit (pago, 99.5% de precisão, SparkScan). Para um leitor QR simples, ZXing ou ML Kit são suficientes.

Que formatos de códigos de barras o ML Kit suporta?

O ML Kit Barcode Scanning suporta 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. Também suporta GS1 DataBar (RSS-14, RSS-Expanded). A lista completa está na documentação Barcode.FORMAT_*. Para limitar formatos use setBarcodeFormats() — isto acelera a digitalização 2–3 vezes.

Como acelerar a digitalização de códigos de barras?

Reduza a resolução da câmara para 480p (640x480), ative o foco automático contínuo, limite os formatos aos necessários (setBarcodeFormats), use o modo de desempenho FAST. Para o ML Kit especifique apenas os formatos necessários — excluir formatos extra acelera a digitalização 2–3 vezes. Para o ZXing — use HybridBinarizer em vez de GlobalHistogramBinarizer (20% mais rápido). Para o AVFoundation — especifique metadataObjectTypes.

A digitalização de códigos de barras funciona sem internet?

Sim, todos os SDKs locais de Barcode Scanning (ML Kit, ZXing, AVFoundation, Scandit) funcionam completamente offline. O ML Kit requer internet apenas para a descarga inicial do modelo (modo descarregado), após o qual o modelo é armazenado em cache no dispositivo. O AVFoundation está integrado no iOS, não requer internet. O ZXing é totalmente offline sem Play Services. A digitalização na nuvem (Google Cloud Vision) não é usada em aplicações móveis.

Podem digitalizar-se códigos de barras danificados ou desfocados?

O ML Kit e a Scandit têm correção integrada para códigos danificados graças a algoritmos de redes neuronais. O ML Kit restaura até 30% de um código danificado (riscos, rasgos). A Scandit — até 50% graças ao treino com códigos defeituosos. O ZXing praticamente não restaura códigos danificados — requer uma imagem nítida. Para digitalizar códigos defeituosos use a Scandit ou o ML Kit com o modo de desempenho ACCURATE.

Resumo

  • Barcode Scanning — deteção e descodificação de códigos 1D/2D com a câmara do smartphone
  • ML Kit — 98.5% de precisão, multi-código, deteção em qualquer parte do enquadramento, gratuito
  • ZXing — open-source, compatível com qualquer dispositivo, 92% de precisão
  • AVFoundation — scanner nativo do iOS, integrado no sistema (iOS 7+)
  • Scandit — SDK empresarial (99.5%), SparkScan, MatrixScan, a partir de $400/mês
  • Otimização — resolução 480p, focagem automática, limitação de formatos, feedback háptico
  • Todos os formatos — EAN, UPC, QR, Data Matrix, PDF417, Aztec, Code 128

Vamos desenvolver um aplicativo móvel chave na mão

A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.

Discutir o projeto

Leia também