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.
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?
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.
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.
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.
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.
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()
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:
Get an instance of BarcodeScanner:
val scanner = BarcodeScanning.getClient()// Or, to specify the formats to recognize:// val scanner = BarcodeScanning.getClient(options)
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.
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);
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.