ML Kit Barcode Scanner vs. Scandit

Published

Considering whether the ML Kit barcode scanner or the Scandit SDK is better for your application?

At first glance, developing a barcode scanning application may seem simple: add a button to the user interface, open the device camera, capture an image, decode data, and display results.

But the reality of the enterprise environments Scandit has worked in with over 2,100 customers and over 15 years of data capture experience is more complex. We’ve found that barcode scanning must be fast, accurate, and reliable across a wide range of scenarios and environmental conditions.

Think of situations where barcodes are clustered close together on a shelf or located within a dimly lit space, or when tiny barcodes are located at the maximum range of a device’s camera. In real-world warehouses, stores, and delivery trucks, mis-scans and rescans cost time, money, and productivity.

We believe that for an enterprise app developer, choosing the right barcode scanning software is critical. It’s more than prototyping what works in a sample app, it’s about deploying capabilities that work at scale in real enterprise environments.

It’s also about getting the most value out of your barcode scanning library without spending weeks or months in development. And if something goes wrong, you need the right support.

Two popular options for adding barcode scanning to apps running on smartphones or handheld computers are the ML Kit barcode scanner and the Scandit Barcode Scanner SDK.

ML Kit, developed by Google, is a machine learning library that seems to include barcode scanning as one of many vision-related features. The Scandit SDK is a dedicated enterprise barcode and ID scanning toolkit. It uses machine learning and computer vision techniques under the hood.

In this blog, we’ll compare ML Kit and the Scandit SDK across the criteria that we believe matter most to developers: performance, accuracy, user experience, feature set, platform support, and developer support.

Comparing the ML Kit barcode scanner vs. the Scandit SDK

ML Kit appears to be a general-purpose machine learning SDK that includes, as of April 2025, features such as barcode scanning, image labeling, face detection, and text recognition. It seems built to support a broad range of applications with no licensing or royalty fees.

The Scandit SDK is a commercial library built for enterprise barcode and ID scanning. Its architecture is tuned to assist users across a variety of enterprise use cases and environmental conditions.

For an overview of the technical details behind barcodes and the general barcode scanning process, read our blog on how barcode scanners work.

The following sections compare the two SDKs across various criteria. These results were derived from a side-by-side feature comparison in April 2025, and tests conducted by our Product Engineering team in February 2023.

The tests used:

  • Software: ML Kit version 17.2.0 and Scandit SDK version 6.22.0 (the most recent versions of the software as of April 2023)
  • Hardware: Both SDKs were tested on Samsung Galaxy S21 and Samsung XCover Pro devices.
  • Barcode symbologies (different types and numbers were used based on the test): Codabar, Code 39, Code 128, Data Matrix, EAN-8, EAN-13, ITF, QR Code, and UPC-E.
  • Shelf heights (for range and angle testing): 0.15 m (bottom), 1 m (middle), 1.8 m (top).

The Scandit Product Engineering team uses an extensive suite of tests to measure scan performance on a wide range of devices and reflect real use cases in data capture. They support customers daily in executing performance testing, from setting up environments to making development recommendations based on the results.

Robot-based testing is used to extract in-depth performance metrics. Use-case-specific testing (with human scanning) is used for specific scenarios and environments. Note that robot-based testing is not practical for all scenarios when testing data capture.

For more information about Scandit’s approach to testing, see our guide on how to measure barcode scanning performance.

The tests in this blog are based on the software versions current in April 2023. Both ML Kit and the Scandit SDK have been updated since these tests were run.

Want to see the data for yourself? Contact us to request an in-depth look at the Scandit barcode scanning SDK's performance, including performance data for more recent software versions.

What is the performance of the ML Kit barcode scanner vs. Scandit?

Speed

Speed is one of the most critical performance factors that developers typically look for in enterprise barcode scanning workflows. One way to measure it—and the way we did so here—is by measuring the total time to scan, from the user positioning the device to results being sent to your app.

Our product engineering team’s tests showed that:

  • In continuous proof-of-delivery workflows, it took 11.7 seconds for a human to scan eight packages consecutively using ML Kit. The same workflow using the Scandit SDK took 6.7 seconds—making the Scandit SDK almost 2X faster.
  • Electronic shelf labels (ESL) present challenges for barcode scanning software because of the small size of barcodes and because they are often positioned above the user’s eyeline or down by their feet. It took 20 seconds for a human to scan four ESLs positioned on a bottom shelf using ML Kit. The same workflow using Scandit took 5 seconds—meaning that the Scandit SDK was 4X faster.

According to ML Kit’s documentation, the API recognizes no more than ten barcodes per API call. There is no theoretical limit to the number of barcodes Scandit software can recognize per API call, although your device’s speed and memory may create practical limitations.

Accuracy

Most developers consider accuracy to be equally important. One way to measure accuracy is through measuring the number of false positives (the number of times scanning software “thinks” it scanned a barcode successfully, but actually decoded the barcode incorrectly).

When a robot continuously scanned EAN-13, Code 39, and Code 128 barcodes for 30 minutes, our product engineering team found that:

  • Scandit software had a 0% false positive rate for all three barcodes.
  • ML Kit had false positive rates of 5% for EAN-13, 5% for Code 128, and 10-70% for Code 39. (The rate for Code 39 varies widely because for this symbology damaged barcodes generated a high number of false positives when using ML Kit.)

Scan range

In our experience, scan range is also important in real-world conditions. Employees in warehouses or retail stores may have to scan items from extended distances, such as barcodes on high shelves or products on a moving conveyor belt.

In our product engineering team’s tests using human-scanned barcodes, Scandit had a longer range for all tested barcode symbologies. This ranged from 26% longer for Code 128 up to 167% longer for Code 39.

Battery efficiency

We believe that a direct comparison of battery performance is nearly impossible, as it depends on many factors. These include device type and age, operating system, application code, and any concurrently running apps and system services.

However, the Scandit SDK includes a built-in standby mode that supports instant camera reactivation while minimizing power consumption during idle periods. ML Kit does not appear to offer this feature out of the box, leaving you to implement your own power optimization logic.

What barcode symbologies do ML Kit and Scandit support?

For both SDKs, the supported symbologies as of April 2025, according to the documentation, are listed below. For the most up-to-date list, refer to ML Kit's format list and the Scandit SDK's supported symbologies.


ML Kit

Scandit SDK

Supported symbologies

1D formats:

Codabar, Code 39, Code 93, Code 128, EAN-8, EAN-13, ITF, UPC-A, UPC-E

2D formats:

Aztec, Data Matrix, PDF417, QR Code

1D formats:

Codabar, Code 11, Code 25, Code 32, Code 39, Code 93, Code 128, EAN-2, EAN-5, EAN-8, EAN-13, GS1 DataBar, IATA 2 of 5, ITF, JAN, Matrix 2 of 5, MSI Plessey, UPC-A, UPC-E

2D formats:

ArUco, Aztec, Data Matrix, Data Matrix Direct Part Marking (DPM), Data Matrix Rectangular Extension, DotCode, Micro PDF417, MaxiCode, Micro QR Code, PDF417, QR Code, Rectangular Micro QR Code

GS1 Composite Codes (A, B, C)

Postal codes:

Australia Post, French Postal Code (La Poste), KIX (Klant index), Posi LAPA 4 State Code, Royal Mail 4 State Customer Code (RM4SCC), Swiss Post, UPU (Universal Postal Union) S18 4-State Code, USPS Intelligent Mail

Additional formats:

GS1 Data Carrier, 3D barcodes

Known limitations

ML Kit’s API does not recognize:

  • 1D Barcodes with only one character
  • Barcodes in ITF format with fewer than six characters, and this format is known to be flaky due to absence of checksum
  • Barcodes encoded with FNC2, FNC3 or FNC4
  • QR codes generated in the ECI mode

None

How does user experience development differ between the ML Kit barcode scanner and Scandit?

In enterprise workflows, we believe that user experience has a direct impact on scanning performance, accuracy, and employee satisfaction. Our experience suggests that a poorly designed interface can slow users down, increase scan errors, and cause frustration, especially under time pressure or in physically demanding environments.

ML Kit does not appear to provide UI components or workflows for barcode scanning. You must design the scanning interface yourself, or build upon community code samples, and decide how to guide users, handle feedback, and integrate scanning results into existing workflows.

The Scandit SDK offers the flexibility to choose between customizing and configuring your own UI, or using pre-built UI components for single and multiple barcode scanning.

Its workflows are shaped by extensive user research and field testing, reducing your need to develop and test what works best for users. The Scandit SDK provides pre-built UI components for single and multiple barcode scanning. SparkScan, for example, guides users in aligning the camera, confirms successful scans, and handles edge cases.

What advanced barcode scanning features do ML Kit and Scandit offer?

Our experience of enterprise workflows suggest that many developers may need features beyond basic barcode scanning. For example, augmented reality overlays can help warehouse workers instantly locate the right barcode on the right parcel, or context- based scanning, powered by AI, can reduce unwanted scans by up to 100%.

Integrating barcode scanning into your app also opens up the possibility of adding value in other business areas. For example, the low-level machine vision capabilities provided by ML Kit offer the flexibility to develop new types of applications tailored to your business needs.

The table below provides a quick comparison of how we believe each library supports the most common advanced features that enterprises generally look for.

Feature

ML Kit

Scandit

Automatic symbology detection

Multiple barcode scanning

Works with any orientation

Gesture support

Augmented reality (AR) overlays

Not natively (can be added with ARCore)

Simultaneous barcode and text scanning data capture

Low-level machine vision APIs

Context-based scanning using AI

On-device processing

Works without network connectivity

Customizable viewfinder

What development considerations are there when implementing the ML Kit barcode scanner vs. the Scandit SDK?

Android ML Kit appears to depend on Google Play Services, which could be a limitation for developers who cannot or do not want to use Google's proprietary behind-the-scenes infrastructure for Android apps. Examples are apps targeting custom enterprise hardware, devices used in restricted environments, or developers working in countries with regional restrictions, e.g. China .

Developers targeting iOS deployments should also be aware that we believe ML Kit is only available through CocoaPods. Their documentation states that “You can't mix frameworks and cocoapods, so in order to use this library you need to first migrate to use cocoapods.”

The Scandit SDK is a self-contained solution that runs across a wide range of iOS and Android-based devices, including those that operate without Google Play Services. It also supports a wide range of development frameworks and programming languages.

We believe that both ML Kit and the Scandit SDK support only 64-bit architectures.

Support and maintenance

ML Kit developers appear to rely on community forums and online documentation for support. Third-party vendors, such as Huawei, may offer professional development services and support.

ML Kit does not appear to have a guaranteed update cadence or offer direct support from Google. As per the ML Kit documentation, “We make decisions on the release of an API based on the feedback we receive during the early access program,” and “Some early access features may eventually become generally available, but there is no fixed release schedule.” The ML Kit release notes show the typical cadence of feature updates and bug fixes.

The Scandit SDK offers enterprise-grade support throughout your product lifecycle. The support team helps resolve barcode scanning integration challenges, and ensures your scanning solution is implemented correctly.

Scandit support includes formal service-level agreements (SLAs) for software updates, security patches, and bug fixes, together with enterprise-grade customer success offerings such as innovation workshops, process optimizations and UI/UX reviews for eligible customers.

The Scandit SDK has a frequent release cadence.

Comparing ML Kit deployment vs. Scandit SDK

To see what it looks like to get started with each library, the following sections guide you through their configuration steps, providing notes on the key differences.

The following steps use the Kotlin instructions from the ML Kit getting started guide and the Scandit SparkScan getting started guide for React Native. (We haven’t included the package installation and licensing steps in order to get to the code quickly.)

In April 2025, both SDKs also offered these sample apps:

If you don’t have an IDE handy, you can run one of the Scandit samples in your browser now using StackBlitz.

1. Configure the barcode scanner

ML Kit

Both ML Kit and the Scandit Barcode Scanner SDK seem to recommend configuring their libraries to use only the barcode symbologies required by your business.

Scandit SDK

For ML Kit, the following code sample configures the detection of Aztec and QR codes, using a BarcodeScannerOptions object:

val options = BarcodeScannerOptions.Builder()
        .setBarcodeFormats(
                Barcode.FORMAT_QR_CODE,
                Barcode.FORMAT_AZTEC)
        .build()

For Scandit SparkScan, we use SparkScanSettings:

const settings = new SparkScanSettings();
settings.enableSymbologies([Symbology.QR, Symbology.Aztec]);
const sparkScan = SparkScan.forSettings(settings);

2. Prepare the input image

ML Kit

ML Kit appears to require you to pass the image taken by the device’s camera to its BarcodeScanner's process method.

Scandit SDK

Not required as the SDK does this for you.

Follow these steps to pass an image to ML Kit’s BarcodeScanner process method.

Create an InputImage object from a media.Image object by passing the media.Image object and the image's rotation to InputImage.fromMediaImage():

private class YourImageAnalyzer : ImageAnalysis.Analyzer {

    override fun analyze(imageProxy: ImageProxy) {
        val mediaImage = imageProxy.image
        if (mediaImage != null) {
            val image = InputImage.fromMediaImage(mediaImage, imageProxy.imageInfo.rotationDegrees)
            // Pass image to an ML Kit Vision API
            // ...
        }
    }
}

You can also use a file URI, a ByteBuffer, a ByteArray, or a Bitmap to pass the image, as described in the ML Kit documentation.

If your camera library doesn’t provide the image's rotation degree, calculate it from the device's rotation degree and the orientation of the camera sensor on the device before passing it to InputImage.fromMediaImage():

private val ORIENTATIONS = SparseIntArray()

init {
    ORIENTATIONS.append(Surface.ROTATION_0, 0)
    ORIENTATIONS.append(Surface.ROTATION_90, 90)
    ORIENTATIONS.append(Surface.ROTATION_180, 180)
    ORIENTATIONS.append(Surface.ROTATION_270, 270)
}

/**
 * Get the angle by which an image must be rotated given the device's current
 * orientation.
 */
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Throws(CameraAccessException::class)
private fun getRotationCompensation(cameraId: String, activity: Activity, isFrontFacing: Boolean): Int {
    // Get the device's current rotation relative to its "native" orientation.
    // Then, from the ORIENTATIONS table, look up the angle the image must be
    // rotated to compensate for the device's rotation.
    val deviceRotation = activity.windowManager.defaultDisplay.rotation
    var rotationCompensation = ORIENTATIONS.get(deviceRotation)

    // Get the device's sensor orientation.
    val cameraManager = activity.getSystemService(CAMERA_SERVICE) as CameraManager
    val sensorOrientation = cameraManager
            .getCameraCharacteristics(cameraId)
            .get(CameraCharacteristics.SENSOR_ORIENTATION)!!

    if (isFrontFacing) {
        rotationCompensation = (sensorOrientation + rotationCompensation) % 360
    } else { // back-facing
        rotationCompensation = (sensorOrientation - rotationCompensation + 360) % 360
    }
    return rotationCompensation
}

Once you have the rotation degree value, pass it and the media.Image object to InputImage.fromMediaImage():

val image = InputImage.fromMediaImage(mediaImage, rotation)

3. Process the input image

ML Kit

It appears that ML Kit requires you to explicitly process the input image.

Scandit SDK

Not required as the SDK does this for you.

Follow these steps to process an image with ML Kit:

  1. Get an instance of BarcodeScanner:
    val scanner = BarcodeScanning.getClient()
    // Or, to specify the formats to recognize:
    // val scanner = BarcodeScanning.getClient(options)
  2. Process the image:
    val result = scanner.process(image)
            .addOnSuccessListener { barcodes ->
                // Task completed successfully
                // ...
            }
            .addOnFailureListener {
                // Task failed with an exception
                // ...
            }

4. Set up and customize the scanning UI

ML Kit

It seems that you must build UI components and workflows yourself, as they do not appear to be available with ML Kit.

Scandit SDK

All Scandit software includes customizable UI components. These require configuration to meet your unique requirements.

For this walkthrough, we’ll use Scandit SparkScan, a pre-built barcode scanning component deployable on any iOS and Android app. It has a built-in user interface that includes the camera preview and scanning UI elements. These guide the user through the scanning process and are fully customizable to suit your workflows and business branding.

The SparkScanView appearance is customized through SparkScanViewSettings – see SparkScan Workflow Options for information on advanced customizations.

sparkScanViewSettings={new SparkScanViewSettings()}

// setup the desired appearance settings by updating the fields in the object above

Adding a SparkScanView to your view hierarchy automatically adds the scanning interface (camera preview and scanning UI elements).

const sparkScanViewRef = useRef<SparkScanView | null>(null);

To change different aspects of the UI:

  1. Change the color of the trigger button background and its animation (the pulsing effect shown when the scanner is active):
    sparkScanViewRef..triggerButtonExpandedColor = Color.fromHex("#123768");
    sparkScanViewRef..triggerButtonAnimationColor = Color.fromHex("#59D3DE");
  2. Change the toolbar background color:
    sparkScanViewRef..toolbarBackgroundColor = Color.fromHex("#01AAA7");
  3. Change the camera preview from its default smaller size to a larger window:
    sparkScanViewSettings.defaultMiniPreviewSize = SparkScanMiniPreviewSize.Expanded;

Additionally, you must call SparkScanView.stopScanning() in your app’s state handling logic to ensure SparkScanView works correctly.

useEffect(() => {
	const handleAppStateChangeSubscription = AppState.addEventListener('change', (nextAppState: AppStateStatus) => {
	if (nextAppState.match(/inactive|background/)) {
		sparkScanComponent.stopScanning();
	} else {
		checkCameraPermissions();
	}
	
return () => {
		handleAppStateChangeSubscription.remove();
	}
}

5. Get data from barcodes

ML Kit

It appears that both ML Kit and the Scandit SDK use listeners to trigger the retrieval of barcode data.

Scandit SDK

The following sections explain how each library supports listener methods to inform your app of successful barcode scans.

ML Kit

If barcode recognition succeeds, a list of Barcode objects is passed to a success listener. Each Barcode object represents a barcode that was detected in the image.

for (Barcode barcode: barcodes) {
    Rect bounds = barcode.getBoundingBox();
    Point[] corners = barcode.getCornerPoints();

    String rawValue = barcode.getRawValue();

    int valueType = barcode.getValueType();
    // See API reference for complete list of supported types
    switch (valueType) {
        case Barcode.TYPE_WIFI:
            String ssid = barcode.getWifi().getSsid();
            String password = barcode.getWifi().getPassword();
            int type = barcode.getWifi().getEncryptionType();
            break;
        case Barcode.TYPE_URL:
            String title = barcode.getUrl().getTitle();
            String url = barcode.getUrl().getUrl();
            break;
    }
}

Scandit SDK

To keep track of scanned barcodes, implement the SparkScanListener interface and register the listener to the SparkScan mode.

// Register a listener object to monitor the spark scan session.
const listener: SparkScanListener = {
	didScan: (
		sparkScan: SparkScan,
		session: SparkScanSession, 
		getFrameData: () => Promise<FrameData | null>)
	) => {
		// Gather the recognized barcode
	const barcode = session.newlyRecognizedBarcode[0];
	// Handle the barcode
},
};
sparkScan.addListener(listener);

SparkScanListener.didScan() is called when a new barcode is scanned and the result is retrieved from the first object in the provided barcodes list: SparkScanSession.newlyRecognizedBarcodes. Note that this list only contains one barcode entry.

Why choosing the right barcode scanning software for your workflow is important

Taking time to choose the right barcode scanning software for your workflow can help you avoid costly fixes later down the line.

Retail employees scan thousands of barcodes every day, demanding high-speed performance and pinpoint accuracy. Last-mile delivery drivers need scanners that work seamlessly in bright daylight or low-light conditions—and stay reliable even without a stable internet connection. Meanwhile, warehouse workers often need to capture barcodes from long distances and awkward angles.

Getting your barcode scanning library wrong could impact efficiency, productivity, and employee and customer experience. Your needs for speed, accuracy, flexibility, ease of integration, advanced features, and support will help you to determine which barcode scanning library is right for you.