Skip to content

@capacitor-mlkit/barcode-scanning

Unofficial Capacitor plugin for ML Kit Barcode Scanning.12

Features

  • 🧩 Optional ready-to-use interface without webview customizations
  • 🏎️ Extremely fast
  • 📷 Scan multiple barcodes at once
  • ⏺️ Define detection area
  • 🏞️ Reading barcodes from images
  • 🔦 Torch and Autofocus support
  • 🔋 Supports Android and iOS

For a complete list of supported barcodes, see BarcodeFormat.

Demo

A working example can be found here: https://github.com/robingenz/capacitor-mlkit-plugin-demo

Android

Guides

Installation

npm install @capacitor-mlkit/barcode-scanning@next
npx cap sync

Attention: Please use the next tag to install the latest version of the plugin due to issue #179.

Android

Permissions

This API requires the following permissions be added to your AndroidManifest.xml before the application tag:

<!-- To get access to the camera. -->
<uses-permission android:name="android.permission.CAMERA" />
<!-- To get access to the flashlight. -->
<uses-permission android:name="android.permission.FLASHLIGHT"/>

You also need to add the following meta data in the application tag in your AndroidManifest.xml:

<meta-data android:name="com.google.mlkit.vision.DEPENDENCIES" android:value="barcode_ui"/>
<!-- To use multiple models: android:value="face,model2,model3" -->

Data Binding

Enable the databinding library by setting the dataBinding and enabled build options to true in your module-level (app-level) Gradle file (usually android/app/build.gradle):

android {
    ...
+    buildFeatures {
+        dataBinding true
+    }
+    dataBinding {
+        enabled = true
+    }
}

iOS

Minimum Deployment Target

Make sure to set the deployment target in your ios/App/Podfile to at least 15.5:

platform :ios, '15.5'

Variables

This plugin will use the following project variables (defined in your app’s variables.gradle file):

  • $androidxCameraCamera2Version version of com.google.mlkit:barcode-scanning (default: 1.1.0)
  • $androidxCameraCoreVersion version of com.google.mlkit:barcode-scanning (default: 1.1.0)
  • $androidxCameraLifecycleVersion version of com.google.mlkit:barcode-scanning (default: 1.1.0)
  • $androidxCameraViewVersion version of com.google.mlkit:barcode-scanning (default: 1.1.0)
  • $mlkitBarcodeScanningVersion version of com.google.mlkit:barcode-scanning (default: 17.1.0)
  • $playServicesCodeScannerVersion version of com.google.mlkit:barcode-scanning (default: 16.0.0)

iOS

Add the NSCameraUsageDescription key to the ios/App/App/Info.plist file, which tells the user why the app needs to use the camera:

+ <key>NSCameraUsageDescription</key>
+ <string>The app enables the scanning of various barcodes.</string>

Configuration

No configuration required for this plugin.

Demo

A working example can be found here: robingenz/capacitor-mlkit-plugin-demo

Usage

import {
  BarcodeScanner,
  BarcodeFormat,
  LensFacing,
} from '@capacitor-mlkit/barcode-scanning';

const startScan = async () => {
  // The camera is visible behind the WebView, so that you can customize the UI in the WebView.
  // However, this means that you have to hide all elements that should not be visible.
  // You can find an example in our demo repository.
  // In this case we set a class `barcode-scanner-active`, which then contains certain CSS rules for our app.
  document.querySelector('body')?.classList.add('barcode-scanner-active');

  // Add the `barcodeScanned` listener
  const listener = await BarcodeScanner.addListener(
    'barcodeScanned',
    async result => {
      console.log(result.barcode);
    },
  );

  // Start the barcode scanner
  await BarcodeScanner.startScan();
};

const stopScan = async () => {
  // Make all elements in the WebView visible again
  document.querySelector('body')?.classList.remove('barcode-scanner-active');

  // Remove all listeners
  await BarcodeScanner.removeAllListeners();

  // Stop the barcode scanner
  await BarcodeScanner.stopScan();
};

const scanSingleBarcode = async () => {
  return new Promise(async resolve => {
    document.querySelector('body')?.classList.add('barcode-scanner-active');

    const listener = await BarcodeScanner.addListener(
      'barcodeScanned',
      async result => {
        await listener.remove();
        document
          .querySelector('body')
          ?.classList.remove('barcode-scanner-active');
        await BarcodeScanner.stopScan();
        resolve(result.barcode);
      },
    );

    await BarcodeScanner.startScan();
  });
};

const scan = async () => {
  const { barcodes } = await BarcodeScanner.scan({
    formats: [BarcodeFormat.QrCode],
  });
  return barcodes;
};

const isSupported = async () => {
  const { supported } = await BarcodeScanner.isSupported();
  return supported;
};

const enableTorch = async () => {
  await BarcodeScanner.enableTorch();
};

const disableTorch = async () => {
  await BarcodeScanner.disableTorch();
};

const toggleTorch = async () => {
  await BarcodeScanner.toggleTorch();
};

const isTorchEnabled = async () => {
  const { enabled } = await BarcodeScanner.isTorchEnabled();
  return enabled;
};

const isTorchAvailable = async () => {
  const { available } = await BarcodeScanner.isTorchAvailable();
  return available;
};

const setZoomRatio = async () => {
  await BarcodeScanner.setZoomRatio({ zoomRatio: 0.5 });
};

const getZoomRatio = async () => {
  const { zoomRatio } = await BarcodeScanner.getZoomRatio();
  return zoomRatio;
};

const getMinZoomRatio = async () => {
  const { zoomRatio } = await BarcodeScanner.getMinZoomRatio();
  return zoomRatio;
};

const getMaxZoomRatio = async () => {
  const { zoomRatio } = await BarcodeScanner.getMaxZoomRatio();
  return zoomRatio;
};

const openSettings = async () => {
  await BarcodeScanner.openSettings();
};

const isGoogleBarcodeScannerModuleAvailable = async () => {
  const { available } =
    await BarcodeScanner.isGoogleBarcodeScannerModuleAvailable();
  return available;
};

const installGoogleBarcodeScannerModule = async () => {
  await BarcodeScanner.installGoogleBarcodeScannerModule();
};

const checkPermissions = async () => {
  const { camera } = await BarcodeScanner.checkPermissions();
  return camera;
};

const requestPermissions = async () => {
  const { camera } = await BarcodeScanner.requestPermissions();
  return camera;
};

An example of the CSS class barcode-scanner-active with Ionic Framework could be:

// Hide all elements
body.barcode-scanner-active {
  visibility: hidden;
  --background: transparent;
  --ion-background-color: transparent;
}

// Show only the barcode scanner modal
.barcode-scanner-modal {
  visibility: visible;
}

@media (prefers-color-scheme: dark) {
  .barcode-scanner-modal {
    --background: transparent;
    --ion-background-color: transparent;
  }
}

An example of the CSS class barcode-scanner-active without Ionic Framework could be:

// Hide all elements
body.barcode-scanner-active {
  visibility: hidden;
}

// Show only the barcode scanner modal
.barcode-scanner-modal {
  visibility: visible;
}

If you can't see the camera view, make sure all elements in the DOM are not visible or have a transparent background to debug the issue.

API

startScan(...)

startScan(options?: StartScanOptions | undefined) => Promise<void>

Start scanning for barcodes.

Only available on Android and iOS.

Param Type
options StartScanOptions

Since: 0.0.1


stopScan()

stopScan() => Promise<void>

Stop scanning for barcodes.

Only available on Android and iOS.

Since: 0.0.1


readBarcodesFromImage(...)

readBarcodesFromImage(options: ReadBarcodesFromImageOptions) => Promise<ReadBarcodesFromImageResult>

Read barcodes from an image.

Only available on Android and iOS.

Param Type
options ReadBarcodesFromImageOptions

Returns: Promise<ReadBarcodesFromImageResult>

Since: 0.0.1


scan(...)

scan(options?: ScanOptions | undefined) => Promise<ScanResult>

Scan a barcode with a ready-to-use interface without WebView customization.

On Android, this method is only available on devices with Google Play Services installed. Therefore, no camera permission is required.

Attention: Before using this method on Android, first check if the Google Barcode Scanner module is available by using isGoogleBarcodeScannerModuleAvailable().

Only available on Android and iOS.

Param Type
options ScanOptions

Returns: Promise<ScanResult>

Since: 0.0.1


isSupported()

isSupported() => Promise<IsSupportedResult>

Returns whether or not the barcode scanner is supported.

Available on Android and iOS.

Returns: Promise<IsSupportedResult>

Since: 0.0.1


enableTorch()

enableTorch() => Promise<void>

Enable camera's torch (flash) during a scan session.

Only available on Android and iOS.

Since: 0.0.1


disableTorch()

disableTorch() => Promise<void>

Disable camera's torch (flash) during a scan session.

Only available on Android and iOS.

Since: 0.0.1


toggleTorch()

toggleTorch() => Promise<void>

Toggle camera's torch (flash) during a scan session.

Only available on Android and iOS.

Since: 0.0.1


isTorchEnabled()

isTorchEnabled() => Promise<IsTorchEnabledResult>

Returns whether or not the camera's torch (flash) is enabled.

Only available on Android and iOS.

Returns: Promise<IsTorchEnabledResult>

Since: 0.0.1


isTorchAvailable()

isTorchAvailable() => Promise<IsTorchAvailableResult>

Returns whether or not the camera's torch (flash) is available.

Only available on Android and iOS.

Returns: Promise<IsTorchAvailableResult>

Since: 0.0.1


setZoomRatio(...)

setZoomRatio(options: SetZoomRatioOptions) => Promise<void>

Set the zoom ratio of the camera.

Only available on Android and iOS.

Param Type
options SetZoomRatioOptions

Since: 5.4.0


getZoomRatio()

getZoomRatio() => Promise<GetZoomRatioResult>

Get the zoom ratio of the camera.

Only available on Android and iOS.

Returns: Promise<GetZoomRatioResult>

Since: 5.4.0


getMinZoomRatio()

getMinZoomRatio() => Promise<GetMinZoomRatioResult>

Get the minimum zoom ratio of the camera.

Only available on Android and iOS.

Returns: Promise<GetMinZoomRatioResult>

Since: 5.4.0


getMaxZoomRatio()

getMaxZoomRatio() => Promise<GetMaxZoomRatioResult>

Get the maximum zoom ratio of the camera.

Only available on Android and iOS.

Returns: Promise<GetMaxZoomRatioResult>

Since: 5.4.0


openSettings()

openSettings() => Promise<void>

Open the settings of the app so that the user can grant the camera permission.

Only available on Android and iOS.

Since: 0.0.1


isGoogleBarcodeScannerModuleAvailable()

isGoogleBarcodeScannerModuleAvailable() => Promise<IsGoogleBarcodeScannerModuleAvailableResult>

Check if the Google Barcode Scanner module is available.

If the Google Barcode Scanner module is not available, you can install it by using installGoogleBarcodeScannerModule().

Only available on Android.

Returns: Promise<IsGoogleBarcodeScannerModuleAvailableResult>

Since: 5.1.0


installGoogleBarcodeScannerModule()

installGoogleBarcodeScannerModule() => Promise<void>

Install the Google Barcode Scanner module.

Attention: This only starts the installation. The googleBarcodeScannerModuleInstallProgress event listener will notify you when the installation is complete.

Only available on Android.

Since: 5.1.0


checkPermissions()

checkPermissions() => Promise<PermissionStatus>

Check camera permission.

Only available on Android and iOS.

Returns: Promise<PermissionStatus>

Since: 0.0.1


requestPermissions()

requestPermissions() => Promise<PermissionStatus>

Request camera permission.

Only available on Android and iOS.

Returns: Promise<PermissionStatus>

Since: 0.0.1


addListener('barcodeScanned', ...)

addListener(eventName: 'barcodeScanned', listenerFunc: (event: BarcodeScannedEvent) => void) => Promise<PluginListenerHandle>

Called when a barcode is scanned.

Available on Android and iOS.

Param Type
eventName 'barcodeScanned'
listenerFunc (event: BarcodeScannedEvent) => void

Returns: Promise<PluginListenerHandle>

Since: 0.0.1


addListener('barcodesScanned', ...)

addListener(eventName: 'barcodesScanned', listenerFunc: (event: BarcodesScannedEvent) => void) => Promise<PluginListenerHandle>

Called when barcodes are scanned.

Available on Android and iOS.

Param Type
eventName 'barcodesScanned'
listenerFunc (event: BarcodesScannedEvent) => void

Returns: Promise<PluginListenerHandle>

Since: 6.2.0


addListener('scanError', ...)

addListener(eventName: 'scanError', listenerFunc: (event: ScanErrorEvent) => void) => Promise<PluginListenerHandle>

Called when an error occurs during the scan.

Available on Android and iOS.

Param Type
eventName 'scanError'
listenerFunc (event: ScanErrorEvent) => void

Returns: Promise<PluginListenerHandle>

Since: 0.0.1


addListener('googleBarcodeScannerModuleInstallProgress', ...)

addListener(eventName: 'googleBarcodeScannerModuleInstallProgress', listenerFunc: (event: GoogleBarcodeScannerModuleInstallProgressEvent) => void) => Promise<PluginListenerHandle>

Called when the Google Barcode Scanner module is installed.

Available on Android.

Param Type
eventName 'googleBarcodeScannerModuleInstallProgress'
listenerFunc (event: GoogleBarcodeScannerModuleInstallProgressEvent) => void

Returns: Promise<PluginListenerHandle>

Since: 5.1.0


removeAllListeners()

removeAllListeners() => Promise<void>

Remove all listeners for this plugin.

Since: 0.0.1


Interfaces

StartScanOptions

Prop Type Description Since
formats BarcodeFormat[] Improve the speed of the barcode scanner by configuring the barcode formats to scan for. 0.0.1
lensFacing LensFacing Configure the camera (front or back) to use. 0.0.1

ReadBarcodesFromImageResult

Prop Type Description Since
barcodes Barcode[] The detected barcodes. 0.0.1

Barcode

Prop Type Description Since
bytes number[] Raw bytes as it was encoded in the barcode. 0.0.1
calendarEvent BarcodeCalendarEvent Calendar event info. 7.0.0
contactInfo BarcodeContactInfo Person's or organization's business card. 7.0.0
cornerPoints [[number, number], [number, number], [number, number], [number, number]] The four corner points of the barcode in clockwise order starting with top-left. This property is currently only supported by the startScan(...) method. 0.0.1
displayValue string The barcode value in a human readable format. 0.0.1
driverLicense BarcodeDriverLicense Driver license or ID card. 7.0.0
email BarcodeEmail An email message from a 'MAILTO:'. 7.0.0
format BarcodeFormat The barcode format. 0.0.1
geoPoint BarcodeGeoPoint GPS coordinates from a 'GEO:'. 7.0.0
phone BarcodePhone Phone number info. 7.0.0
rawValue string The barcode value in a machine readable format. 0.0.1
sms BarcodeSms A sms message from a 'SMS:'. 7.0.0
urlBookmark BarcodeUrlBookmark A URL and title from a 'MEBKM:'. 7.0.0
valueType BarcodeValueType The barcode value type. 0.0.1
wifi BarcodeWifi A wifi network parameters from a 'WIFI:'. 7.0.0

BarcodeCalendarEvent

Prop Type Description Since
description string The event description. 7.0.0
end string The event end date as ISO 8601 string. 7.0.0
location string The event location. 7.0.0
organizer string The event organizer. 7.0.0
start string The event start date as ISO 8601 string. 7.0.0
status string The event status. 7.0.0
summary string The event summary. 7.0.0

BarcodeContactInfo

Prop Type Description Since
addresses Address[] The contact's addresses. 7.0.0
emails BarcodeEmail[] The contact's emails. 7.0.0
personName PersonName The contact's name. 7.0.0
organization string The contact's organization. 7.0.0
phones BarcodePhone[] The contact's phones. 7.0.0
title string The contact's title. 7.0.0
urls string[] The contact's urls. 7.0.0

Address

Prop Type Description Since
addressLines string[] Formatted address, multiple lines when appropriate. 7.0.0
type AddressType Address type. 7.0.0

BarcodeEmail

Prop Type Description Since
address string The email address. 7.0.0
body string The email body. 7.0.0
subject string The email subject. 7.0.0
type EmailFormatType The email address type. 7.0.0

PersonName

Prop Type Description Since
first string First name. 7.0.0
formattedName string The formatted name. 7.0.0
last string Last name. 7.0.0
middle string Middle name. 7.0.0
prefix string Name prefix. 7.0.0
pronunciation string Text string to be set as the kana name in the phonebook. Used for Japanese contacts. 7.0.0
suffix string Name suffix. 7.0.0

BarcodePhone

Prop Type Description Since
number string The phone number. 7.0.0
type PhoneFormatType The phone number type. 7.0.0

BarcodeDriverLicense

Prop Type Description Since
addressCity string City of holder's address. 7.0.0
addressState string State of holder's address. 7.0.0
addressStreet string Street of holder's address. 7.0.0
addressZip string Postal code of holder's address. 7.0.0
birthDate string Birthdate of the holder. 7.0.0
documentType string "DL" for driver's licenses, "ID" for ID cards. 7.0.0
expiryDate string Expiration date of the license. 7.0.0
firstName string Holder's first name. 7.0.0
gender string Holder's gender. 7.0.0
issueDate string Issue date of the license. 7.0.0
issuingCountry string ISO 3166-1 alpha-3 code in which DL/ID was issued. 7.0.0
lastName string Holder's last name. 7.0.0
licenseNumber string Driver license ID number. 7.0.0
middleName string Holder's middle name. 7.0.0

BarcodeGeoPoint

Prop Type Description Since
latitude number Latitude. 7.0.0
longitude number Longitude. 7.0.0

BarcodeSms

Prop Type Description Since
phoneNumber string The phone number of the sms. 7.0.0
message string The message content of the sms. 7.0.0

BarcodeUrlBookmark

Prop Type Description Since
url string The URL of the bookmark. 7.0.0
title string The title of the bookmark. 7.0.0

BarcodeWifi

Prop Type Description Since
encryptionType WifiEncryptionType Encryption type of the WI-FI. 7.0.0
password string Password of the WI-FI. 7.0.0
ssid string SSID of the WI-FI. 7.0.0

ReadBarcodesFromImageOptions

Prop Type Description Since
formats BarcodeFormat[] Improve the speed of the barcode scanner by configuring the barcode formats to scan for. 0.0.1
path string The local path to the image file. 0.0.1

ScanResult

Prop Type Description Since
barcodes Barcode[] The detected barcodes. 0.0.1

ScanOptions

Prop Type Description Since
formats BarcodeFormat[] Improve the speed of the barcode scanner by configuring the barcode formats to scan for. 0.0.1

IsSupportedResult

Prop Type Description Since
supported boolean Whether or not the barcode scanner is supported by checking if the device has a camera. 0.0.1

IsTorchEnabledResult

Prop Type Description Since
enabled boolean Whether or not the torch is enabled. 0.0.1

IsTorchAvailableResult

Prop Type Description Since
available boolean Whether or not the torch is available. 0.0.1

SetZoomRatioOptions

Prop Type Description Since
zoomRatio number The zoom ratio to set. 5.4.0

GetZoomRatioResult

Prop Type Description Since
zoomRatio number The zoom ratio. 5.4.0

GetMinZoomRatioResult

Prop Type Description Since
zoomRatio number The minimum zoom ratio. 5.4.0

GetMaxZoomRatioResult

Prop Type Description Since
zoomRatio number The maximum zoom ratio. 5.4.0

IsGoogleBarcodeScannerModuleAvailableResult

Prop Type Description Since
available boolean Whether or not the Google Barcode Scanner module is available. 5.1.0

PermissionStatus

Prop Type Since
camera CameraPermissionState 0.0.1

PluginListenerHandle

Prop Type
remove () => Promise<void>

BarcodeScannedEvent

Prop Type Description Since
barcode Barcode A detected barcode. 0.0.1

BarcodesScannedEvent

Prop Type Description Since
barcodes Barcode[] The detected barcodes. 6.2.0

ScanErrorEvent

Prop Type Description Since
message string The error message. 0.0.1

GoogleBarcodeScannerModuleInstallProgressEvent

Prop Type Description Since
state GoogleBarcodeScannerModuleInstallState The current state of the installation. 5.1.0
progress number The progress of the installation in percent between 0 and 100. 5.1.0

Type Aliases

CameraPermissionState

PermissionState | 'limited'

PermissionState

'prompt' | 'prompt-with-rationale' | 'granted' | 'denied'

Enums

BarcodeFormat

Members Value Description Since
Aztec 'AZTEC' Only available on Android and iOS. 0.0.1
Codabar 'CODABAR' Only available on Android and iOS. 0.0.1
Code39 'CODE_39' Only available on Android and iOS. 0.0.1
Code93 'CODE_93' Only available on Android and iOS. 0.0.1
Code128 'CODE_128' Only available on Android and iOS. 0.0.1
DataMatrix 'DATA_MATRIX' Only available on Android and iOS. 0.0.1
Ean8 'EAN_8' Only available on Android and iOS. 0.0.1
Ean13 'EAN_13' Only available on Android and iOS. 0.0.1
Itf 'ITF' Only available on Android and iOS. 0.0.1
Pdf417 'PDF_417' Only available on Android and iOS. 0.0.1
QrCode 'QR_CODE' Only available on Android and iOS. 0.0.1
UpcA 'UPC_A' Only available on Android and iOS. 0.0.1
UpcE 'UPC_E' Only available on Android and iOS. 0.0.1

LensFacing

Members Value Since
Front 'FRONT' 0.0.1
Back 'BACK' 0.0.1

AddressType

Members Value Since
HOME 0 7.0.0
UNKNOWN 1 7.0.0
WORK 2 7.0.0

EmailFormatType

Members Value Since
HOME 0 7.0.0
UNKNOWN 1 7.0.0
WORK 2 7.0.0

PhoneFormatType

Members Value Since
FAX 0 7.0.0
HOME 1 7.0.0
MOBILE 2 7.0.0
UNKNOWN 3 7.0.0
WORK 4 7.0.0

BarcodeValueType

Members Value Since
CalendarEvent 'CALENDAR_EVENT' 0.0.1
ContactInfo 'CONTACT_INFO' 0.0.1
DriversLicense 'DRIVERS_LICENSE' 0.0.1
Email 'EMAIL' 0.0.1
Geo 'GEO' 0.0.1
Isbn 'ISBN' 0.0.1
Phone 'PHONE' 0.0.1
Product 'PRODUCT' 0.0.1
Sms 'SMS' 0.0.1
Text 'TEXT' 0.0.1
Url 'URL' 0.0.1
Wifi 'WIFI' 0.0.1
Unknown 'UNKNOWN' 0.0.1

WifiEncryptionType

Members Value Since
OPEN 1 7.0.0
WEP 2 7.0.0
WPA 3 7.0.0

GoogleBarcodeScannerModuleInstallState

Members Value Since
UNKNOWN 0 5.1.0
PENDING 1 5.1.0
DOWNLOADING 2 5.1.0
CANCELED 3 5.1.0
COMPLETED 4 5.1.0
FAILED 5 5.1.0
INSTALLING 6 5.1.0
DOWNLOAD_PAUSED 7 5.1.0

Common Issues

NullPointerException during startScan(...)

The following error may occur when calling the startScan(...) method: Attempt to invoke virtual method 'void androidx.camera.view.PreviewView.setScaleType(androidx.camera.view.PreviewView$ScaleType)' on a null object reference. In this case, make sure that the databinding library is enabled (see Data Binding).

Terms & Privacy

This plugin uses the Google ML Kit:

Changelog

See CHANGELOG.md.

License

See LICENSE.


  1. This project is not affiliated with, endorsed by, sponsored by, or approved by Google LLC or any of their affiliates or subsidiaries. 

  2. QR Code is a registered trademark of DENSO WAVE INCORPORATED.