IRONSOFTWAREHOME
VÍDEOS

Migrating from Kit de aprendizado de máquina do Google Barcode Scanning to IronBarcode

Curtis Chau
Curtis Chau
Updated: 20 de junho de 2026

Este guia destina-se a equipes em uma das duas situações: você está migrando um aplicativo Android for .NET MAUI ou .NET 9 e precisa substituir o leitor de código de barras do ML Kit por uma alternativa gerenciada, ou você recebeu a recomendação do Kit de aprendizado de máquina do Google em uma discussão sobre código de barras multiplataforma e descobriu — ao tentar adicionar o pacote NuGet — que ele não existe.

O Kit de aprendizado de máquina do Google Barcode Scanning é uma biblioteca nativa para Android e iOS. Ele vem como uma dependência Maven (com.google.mlkit:barcode-scanning:17.3.0 agrupada, ou com.google.android.gms:play-services-mlkit-barcode-scanning:18.3.1 não agrupada) para Kotlin/Java e como um CocoaPod (GoogleMLKit/BarcodeScanning) para Swift. O ML Kit tem sido um produto independente desde junho de 2020 e não requer mais o Firebase, mas não há um SDK oficial para .NET, não há dotnet add package google-mlkit-barcode, e não há uma API C# de primeira parte do Google. Vínculos Xamarin/MAUI mantidos pela comunidade apareceram ao longo dos anos, mas eles quebram quando o ML Kit atualiza seu SDK subjacente.

IronBarcode é uma biblioteca nativa do .NET que é instalada a partir do NuGet, integra-se com padrões .NET padrão e funciona no Windows, Linux, macOS, Docker, Azure e AWS. Este guia mostra como traduzir os padrões que você escreveu em Kotlin ou Java para código C# equivalente.

O Contexto de Portabilidade

Ao migrar do ML Kit para o IronBarcode, algumas coisas mudam estruturalmente — e não apenas sintaticamente:

Callbacks se tornam valores de retorno. O ML Kit usa a API do Android Task com addOnSuccessListener e addOnFailureListener. BarcodeReader.Read() do IronBarcode retorna uma coleção de forma síncrona. Você itera diretamente. Sem registro de retorno de chamada, sem coordenação de threads.

Nenhum objeto scanner. O ML Kit requer que você construa um objeto BarcodeScannerOptions, chame BarcodeScanning.getClient(options) para obter uma instância de scanner, e então chame scanner.process(inputImage). O IronBarcode usa métodos estáticos — BarcodeReader.Read() é o ponto de entrada. Não há instâncias para gerenciar ou descartar.

Nenhuma construção de InputImage. O InputImage do ML Kit deve ser construído a partir de uma fonte específica do Android: InputImage.fromFilePath(context, uri), InputImage.fromBitmap(bitmap, rotation), ou InputImage.fromMediaImage(image, rotation). O IronBarcode aceita uma string de caminho de arquivo, um Stream, um byte[], ou um System.Drawing.Bitmap. Sem contexto do Android, sem URI, sem metadados de rotação.

Sem Google Play Services. O modelo não embutido do ML Kit executa através dos Google Play Services. A variante embutida leva o modelo dentro do APK (adicionando cerca de 2,4 MB) e evita a verificação dos Play Services, mas nenhuma variante está disponível para alvos .NET. O IronBarcode não possui essa dependência — ele funciona de forma idêntica em qualquer plataforma compatível com o .NET .

Configuração rápida em .NET

Remova quaisquer pacotes de vinculação do Xamarin/MAUI ML Kit que existam em seu projeto e, em seguida, instale o IronBarcode:

dotnet add package BarCode

Adicione a chave de licença na inicialização do aplicativo — em Program.cs, MauiProgram.cs, ou Startup.cs, dependendo do tipo do seu aplicativo:

// NuGet: dotnet add package BarCode
using IronBarCode;

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";

A licença pode ser definida em qualquer ponto antes da primeira chamada BarcodeReader.Read() ou BarcodeWriter.CreateBarcode(). Está disponível um período de teste gratuito; O modo de avaliação gera marcas d'água com códigos de barras, mas não restringe a leitura.

Leitura de códigos de barras: Kotlin para C#

Leitura básica de código de barras único

Aqui está um exemplo típico de leitura do ML Kit em Kotlin, que escaneia um único código QR de um URI de arquivo:

// Android Kotlin — ML Kit
val options = BarcodeScannerOptions.Builder()
    .setBarcodeFormats(Barcode.FORMAT_QR_CODE)
    .build()
val scanner = BarcodeScanning.getClient(options)
val inputImage = InputImage.fromFilePath(context, imageUri)

scanner.process(inputImage)
    .addOnSuccessListener { barcodes ->
        val barcode = barcodes.firstOrNull()
        if (barcode != null) {
            Log.d("MLKit", "Value: ${barcode.rawValue}")
            Log.d("MLKit", "Format: ${barcode.format}")
        }
    }
    .addOnFailureListener { e ->
        Log.e("MLKit", "Scan failed: ${e.message}")
    }
Text

O equivalente em C# com IronBarcode:

using IronBarCode;

try
{
    var results = BarcodeReader.Read("captured-image.jpg");
    var barcode = results.FirstOrDefault();
    if (barcode != null)
    {
        Console.WriteLine($"Value: {barcode.Value}");
        Console.WriteLine($"Format: {barcode.Format}");
    }
}
catch (Exception ex)
{
    Console.WriteLine($"Scan failed: {ex.Message}");
}

O resultado está disponível imediatamente como um valor de retorno. barcode.Value corresponde a barcode.rawValue. barcode.Format corresponde a barcode.format. O tratamento de erros utiliza o padrão try/catch em vez de um ouvinte de falhas separado.

Leitura de múltiplos códigos de barras

O ML Kit escaneia um único InputImage e retorna uma lista. Para vários códigos de barras em uma imagem, você itera a lista do ouvinte de sucesso:

// Android Kotlin — ML Kit, multiple barcodes
val options = BarcodeScannerOptions.Builder()
    .setBarcodeFormats(Barcode.FORMAT_ALL_FORMATS)
    .build()
val scanner = BarcodeScanning.getClient(options)
val inputImage = InputImage.fromFilePath(context, imageUri)

scanner.process(inputImage)
    .addOnSuccessListener { barcodes ->
        for (barcode in barcodes) {
            val rawValue = barcode.rawValue
            val format = barcode.format
            processBarcode(rawValue, format)
        }
    }
    .addOnFailureListener { e -> Log.e("MLKit", e.message ?: "Unknown error") }
Text

Com o IronBarcode, defina ExpectMultipleBarcodes = true em BarcodeReaderOptions e itere a coleção de resultados:

using IronBarCode;

var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true
};

var results = BarcodeReader.Read("warehouse-shelf.jpg", options);
foreach (var barcode in results)
{
    Console.WriteLine($"Format: {barcode.Format}, Value: {barcode.Value}");
    ProcessBarcode(barcode.Value, barcode.Format);
}

Especificação de formato: defina os formatos de código de barras como Opções do Leitor de Código de Barras

O ML Kit requer que você especifique quais formatos procurar via setBarcodeFormats(). Se você omitir esse parâmetro, o ML Kit pesquisará em todos os formatos. O IronBarcode funciona da mesma forma — omitir as restrições de formato permite a busca em tudo, mas especificar os tipos esperados melhora o desempenho.

Kit ML KotlinIronBarcode C#
Barcode.FORMAT_QR_CODEBarcodeEncoding.QRCode
Barcode.FORMAT_CODE_128BarcodeEncoding.Code128
Barcode.FORMAT_CODE_39BarcodeEncoding.Code39
Barcode.FORMAT_CODE_93BarcodeEncoding.Code93
Barcode.FORMAT_EAN_13BarcodeEncoding.EAN13
Barcode.FORMAT_EAN_8BarcodeEncoding.EAN8
Barcode.FORMAT_UPC_ABarcodeEncoding.UPCA
Barcode.FORMAT_UPC_EBarcodeEncoding.UPCE
Barcode.FORMAT_PDF417BarcodeEncoding.PDF417
Barcode.FORMAT_DATA_MATRIXBarcodeEncoding.DataMatrix
Barcode.FORMAT_AZTECBarcodeEncoding.Aztec
Barcode.FORMAT_ITFBarcodeEncoding.ITF
Barcode.FORMAT_CODABARBarcodeEncoding.Codabar
Barcode.FORMAT_ALL_FORMATSOmitir ExpectBarcodeTypes

Utilizando sinalizadores de formatação no IronBarcode:

using IronBarCode;

var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true,
    ExpectBarcodeTypes = BarcodeEncoding.QRCode | BarcodeEncoding.Code128 | BarcodeEncoding.EAN13
};

var results = BarcodeReader.Read("product-image.jpg", options);

A combinação OR bit a bit funciona da mesma forma que a lista de formato vararg do ML Kit.

Acesso aos resultados: valor bruto e formato

O objeto de resultado do ML Kit expõe rawValue (um String?) e format (uma constante Int). O resultado do IronBarcode expõe Value (um string) e Format (um valor enumerado BarcodeEncoding).

// Kit ML Kotlin — result fields
val rawValue: String? = barcode.rawValue
val format: Int = barcode.format
val boundingBox: Rect? = barcode.boundingBox
val displayValue: String? = barcode.displayValue
Text
//IronBarcode C#— result fields
string value = barcode.Value;
BarcodeEncoding format = barcode.Format;
int page = barcode.PageNumber; // populated for PDF / multi-page input
C#

barcode.Value é sempre uma string não nula no IronBarcode— se a leitura tiver sucesso, o valor está presente. barcode.Format é o membro da enumeração BarcodeEncoding, que você pode comparar diretamente: if (barcode.Format == BarcodeEncoding.QRCode).

O que há de diferente no .NET?

API síncrona em vez de callbacks. Essa é a mudança estrutural mais significativa. O scanner.process() do ML Kit retorna um Task<List<Barcode>> no sentido do Android — você encadeia ouvintes. O BarcodeReader.Read() do IronBarcode retorna o resultado inline. Se você precisar executá-lo fora do thread da interface do usuário em um aplicativo MAUI, envolva-o em Task.Run():

using IronBarCode;

// In a MAUI ViewModel or page code-behind
var results = await Task.Run(() => BarcodeReader.Read(imagePath));
foreach (var barcode in results)
{
    // update UI on main thread
    MainThread.BeginInvokeOnMainThread(() =>
    {
        ResultLabel.Text = barcode.Value;
    });
}

Nenhum parâmetro de contexto. Cada chamada do ML Kit que constrói um InputImage requer um Context do Android. O IronBarcode precisa apenas de um caminho de arquivo ou fluxo de dados. Remover o encadeamento de contexto da lógica do código de barras simplifica consideravelmente o código.

Sem Google Play Services. O modelo padrão do ML Kit é executado pelo Play Services — BarcodeScanning.getClient() verifica a disponibilidade do Play Services em tempo de execução e lança uma exceção se indisponível.IronBarcode não possui verificação de serviço em tempo de execução. Ou lê a imagem ou lança uma exceção padrão.

Tratamento de exceção padrão. O addOnFailureListener do ML Kit recebe uma subclasse Java Exception. Não .NET, falhas emergem como lançamentos padrão @@--CODE-1354@@, capturáveis com try/catch da forma normal.

Leitura de documentos PDF

O ML Kit não oferece suporte a PDF. InputImage.fromFilePath() com um URI .pdf falha ou lê apenas a primeira página como uma imagem rasterizada, dependendo da versão do Android. Se o seu cenário de portabilidade envolver documentos — processamento de faturas, manifestos logísticos, digitalização de formulários — o IronBarcode lida com PDFs nativamente:

using IronBarCode;

// Read all barcodes from all pages of a PDF
var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true
};

var results = BarcodeReader.Read("invoice-batch.pdf", options);
foreach (var barcode in results)
{
    Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Format}{barcode.Value}");
}

Sem etapa de extração de imagem, sem biblioteca PDF de terceiros, sem loop de iteração de página com renderização separada. Forneça o caminho do PDF e obtenha todos os valores dos códigos de barras com seus respectivos números de página.

Novas capacidades: Geração

O ML Kit não gera códigos de barras — ele apenas os lê. Se a sua aplicação adaptada precisar gerar etiquetas, bilhetes ou códigos QR, o IronBarcode oferece essa funcionalidade no mesmo pacote.

Código 128 para etiquetas de envio:

using IronBarCode;

BarcodeWriter.CreateBarcode("SHIP-2024-98341", BarcodeEncoding.Code128)
    .ResizeTo(400, 120)
    .SaveAsPng("shipping-label.png");

Geração de código QR:

using IronBarCode;

QRCodeWriter.CreateQrCode("https://example.com/track/98341", 500)
    .SaveAsPng("tracking-qr.png");

Código QR com logotipo e cor:

using IronBarCode;

QRCodeWriter.CreateQrCode("https://example.com/product/4821", 500)
    .AddBrandLogo("company-logo.png")
    .ChangeBarCodeColor(System.Drawing.Color.DarkBlue)
    .SaveAsPng("product-qr.png");

Retorna o código de barras como um array de bytes para uma resposta HTTP:

using IronBarCode;

// In anASP.NET Corecontroller action
byte[] barcodeBytes = BarcodeWriter.CreateBarcode("ORDER-7734", BarcodeEncoding.QRCode)
    .ToPngBinaryData();

return File(barcodeBytes, "image/png");
C#

Nenhum desses padrões possui equivalentes no ML Kit. São novas funcionalidades disponíveis porque você está trabalhando em uma biblioteca completa de código de barras .NET, em vez de um scanner exclusivo para dispositivos móveis.

Processamento em lote no servidor

O ML Kit processa uma imagem por chamada, requer o ambiente de execução Android/iOS e não possui o conceito de execução no lado do servidor. O IronBarcode processa arquivos em um loop, é executado noASP.NET Coree escala normalmente:

using IronBarCode;

// Process a folder of scanned document images
var imageFiles = Directory.GetFiles("/data/scans", "*.jpg");
var allResults = new List<(string File, string Value, BarcodeEncoding Format)>();

foreach (var file in imageFiles)
{
    var options = new BarcodeReaderOptions
    {
        Speed = ReadingSpeed.Faster,
        ExpectMultipleBarcodes = false
    };

    var results = BarcodeReader.Read(file, options);
    foreach (var barcode in results)
    {
        allResults.Add((file, barcode.Value, barcode.Format));
    }
}

// Write results to CSV, database, etc.
foreach (var (file, value, format) in allResults)
{
    Console.WriteLine($"{file}: [{format}] {value}");
}

Esse padrão — ler uma pasta de imagens, extrair códigos de barras e agregar resultados — não é possível com o ML Kit. É um fluxo de trabalho padrão do IronBarcode.

Comparação de recursos

RecursoKit de aprendizado de máquina do GoogleIronBarcode
Pacote NuGet .NETNoneBarCode
API C# / .NETNoneSim
Leitura de código de barrasSim (Android/iOS)Sim (todas as plataformas)
Geração de código de barrasNãoSim
Geração de código QRNãoSim
Incorporação de logotipo QRNãoSim
Entrada de PDFNãoSim
Suporte para documentos com várias páginasNãoSim
Entrada de câmera/quadroSimPor meio de arquivo de imagem
Implantação no lado do servidorNãoSim
ASP.NET CoreNãoSim
Azure FunctionsNãoSim
Docker / LinuxNãoSim
Serviços do Google Play necessáriosVariante não embutida apenasNão
Dependência FirebaseNão (autônomo desde junho de 2020)Não
API .NET síncronaNãoSim
Compatível com injeção de dependênciaNãoSim (API estática)
ExpectMultipleBarcodes opçãoPor meio da lista de resultadosBarcodeReaderOptions
Especificação de formatosetBarcodeFormats()ExpectBarcodeTypes
equilíbrio entre velocidade e precisãoFixo (baseado em modelo)ReadingSpeed enum
PreçosGrátis (no dispositivo, apenas móvel)A partir de $999 (Lite) perpétua
PlataformasAndroid, iOSWindows, Linux, macOS, Docker, Azure, AWS

Lista de verificação para migração

Se você estiver migrando um código-fonte do Android ou substituindo uma vinculação não oficial do Xamarin ML Kit, procure esses padrões em seu projeto e aplique as traduções acima:

  • com.google.mlkit:barcode-scanning em arquivos Gradle → remova, adicione BarCode NuGet
  • BarcodeScannerOptions.Builder()new BarcodeReaderOptions { }
  • BarcodeScanning.getClient(options) → remova (nenhuma instância de scanner no IronBarcode)
  • InputImage.fromFilePath(context, uri) → argumento de string de caminho de arquivo
  • InputImage.fromBitmap(bitmap, rotation)BarcodeReader.Read(stream) ou sobrecarga de array de bytes
  • scanner.process(inputImage)BarcodeReader.Read(path, options)
  • .addOnSuccessListener { barcodes -> } → iterar valor de retorno de Read()
  • .addOnFailureListener { e -> } → try/catch em torno de Read()
  • barcode.rawValuebarcode.Value
  • barcode.formatbarcode.Format
  • Barcode.FORMAT_QR_CODEBarcodeEncoding.QRCode
  • Barcode.FORMAT_CODE_128BarcodeEncoding.Code128
  • Barcode.FORMAT_ALL_FORMATS → omitir ExpectBarcodeTypes
  • using Google.MLKit.BarcodeScanning; (vinculação Xamarin) → using IronBarCode;
  • IronBarCode.License.LicenseKey deve ser definido em MauiProgram.cs, Program.cs, ou Startup.cs

A principal tarefa consiste na mudança estrutural de código baseado em callbacks para código síncrono. As constantes de formato e os nomes dos campos de resultado são mapeamentos diretos. O suporte para PDF e geração de arquivos é puramente aditivo — não requer migração, apenas novo código.

Curtis Chau
Redator Técnico

Curtis Chau é bacharel em Ciência da Computação (Universidade Carleton) e se especializa em desenvolvimento front-end, com experiência em Node.js, TypeScript, JavaScript e React. Apaixonado por criar interfaces de usuário intuitivas e esteticamente agradáveis, Curtis gosta de trabalhar com frameworks modernos e criar manuais bem estruturados e visualmente atraentes.

...
Leia mais

Artigos relacionados

Key in blue circle

Obtenha sua chave de avaliação gratuita de 30 dias instantaneamente.

Your trial license will be sent to your email address

Sem limitações. 100% desbloqueado. Sem cartão de crédito.

bullet_checkedNão é necessário cartão de crédito nem criação de conta.Sem limitações. 100% desbloqueado. Sem cartão de crédito.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
Agende sua demonstração ao vivo gratuita.
Booking Badge

Aprovado por milhões de engenheiros em todo o mundo.

Logotipos dos clientes da Iron Software
Agende sua consulta sem compromisso.
Preencha o formulário abaixo ou envie um e-mail para sales@ironsoftware.com
Os seus dados serão sempre mantidos em sigilo.
Aprovado por milhões de engenheiros em todo o mundo.
Logotipos dos clientes da Iron Software
Obtenha sua chave de avaliação gratuita de 30 dias instantaneamente.
Não é necessário cartão de crédito nem criação de conta.