Google code scanner (Android only)

The Google code scanner API provides a complete solution for scanning codes without requiring your app to request camera permission, while preserving user privacy. This is accomplished by delegating the task of scanning the code to Google Play services and returning only the scan results to your app. All image processing occurs on the device and Google doesn't store the results or image data. The API supports the same code formats as the ML Kit Barcode Scanning API and returns the same Barcode object.

This API is ideal for apps that simply need to scan a code and don’t require a custom UI or camera experience. The implementation resides entirely within Google Play services, so there is no significant impact to the size of your app. For more complex use cases that require a custom UI, use the ML Kit Barcode Scanning API directly.

If you have questions, want to submit a bug or need assistance, check the ML Kit community page.

Before you begin

To prepare your app, complete the steps in the following sections.

Configure your app

  1. In your top-level settings.gradle file, include Google's Maven repository and Maven central repository in under the dependencyResolutionManagement block:

    dependencyResolutionManagement {
      repositories {
        google()
        mavenCentral()
      }
    }
    
  2. Add the Google Play services dependency for the play-services-code-scanner SDK to your module's Gradle build file, which is commonly app/build.gradle:

    dependencies {
      implementation 'com.google.android.gms:play-services-code-scanner:16.0.0'
    }
    
  3. You can configure your app to have Google Play services automatically download the scanner module to the device while your app is installed from the Play Store.

    <application ...>
      ...
      <meta-data
          android:name="com.google.mlkit.vision.DEPENDENCIES"
          android:value="barcode_ui"/>
      ...
    </application>
    

    You can also explicitly check the scanner module availability and request download through Google Play services ModuleInstallClient API.

    If you don't enable install-time module downloads or request explicit download, Google Play services will download the scanner module the first time it is used, if it has not already been installed for another use case.

Scan a code

1. (Optional) Configure the code scanner

If you know which barcode formats you expect to read, you can improve the speed of the barcode detector by configuring it to only detect those formats. For example, to detect only Aztec code and QR codes, build a GmsBarcodeScannerOptions object as in the following example:

Kotlin

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

Java

GmsBarcodeScannerOptions options = new GmsBarcodeScannerOptions.Builder()
    .setBarcodeFormats(
        Barcode.FORMAT_QR_CODE,
        Barcode.FORMAT_AZTEC)
    .build();

2. Get an instance of GmsBarcodeScanner

Kotlin

val scanner = GmsBarcodeScanning.getClient(this)
// Or with a configured options
// val scanner = GmsBarcodeScanning.getClient(this, options)

Java

GmsBarcodeScanner scanner = GmsBarcodeScanning.getClient(this);
// Or with a configured options
// GmsBarcodeScanner scanner = GmsBarcodeScanning.getClient(context, options);

3. Request a code scanning by calling startScan()

Kotlin

scanner.startScan()
    .addOnSuccessListener { barcode ->
        // Task completed successfully
    }
    .addOnCanceledListener {
        // Task canceled
    }
    .addOnFailureListener { e ->
        // Task failed with an exception
    }

Java

scanner
    .startScan()
    .addOnSuccessListener(
        barcode -> {
          // Task completed successfully
        })
    .addOnCanceledListener(
        () -> {
          // Task canceled
        })
    .addOnFailureListener(
        e -> {
          // Task failed with an exception
        });

4. Handle the resulting Barcode

Kotlin

val rawValue: String? = barcode.rawValue

Java

String rawValue = barcode.getRawValue();