Capture SDK Guide 

The purpose of the Integration Guide is to give developers everything they need to set up and work with a minimally viable application using the Capture SDK.

Introduction 

The CaptureSDK is targeted to developers who want to use IDEMIA technologies within their mobile apps.

The main features are:

  • Biometric captures
  • Biometric coding
  • Fingerprint capture and matching
  • Biometric authentication and identification
  • Identity documents reading

Adding the SDK to your project 

Gradle

Configure repository:

XML
1buildscript {
2 repositories {
3 maven {
4 url "$repositoryUrlMI"
5 credentials {
6 username "$artifactoryUserMI"
7 password "$artifactoryPasswordMI"
8 }
9 }
10 ...
11 }
12 ...
13}

repositoryUrlMI: Mobile Identity artifactory repository url

artifactoryUserMI: Mobile Identity artifactory username

artifactoryPasswordMI: Mobile Identity artifactory password

These properties can be obtained through Experience Portal(My Identity Proofing -> Access) and should be stored in local gradle.properties file. In such case credentials will not be included in source code. Configuration of properties:

XML
1artifactoryUserMI=artifactory_user
2artifactoryPasswordMI=artifactory_credentials
3repositoryUrlMI=https://mi-artifactory.otlabs.fr/artifactory/smartsdk-android-local

More about gradle properties can be found here.

For biometric features the dependency is:

Groovy
1implementation("morpho.mph_bio_sdk.android:SmartBio:version")

For document features the dependency is:

Groovy
1implementation("morpho.mph_bio_sdk.android:SmartDoc:version")

For all features the dependency is:

Groovy
1implementation("morpho.mph_bio_sdk.android:SmartSDK:version")

Version: artifact version

Components

The SDK comprises six distinct components:

  1. BioCaptureHandler (see: FaceCapture and FingerCapture): Handles the capture of the biometrics through the camera of the device.
  2. BioMatcherHandler (see: FaceCapture and_FingerCapture_: Handles the biometric coding and matching.
  3. DocumentCaptureHandler: Handles the document reading features (like reading MRZ documents).
  4. BioStoreDB_ (see: FaceCapture and _FingerCapture]: Repository to store biometric templates. (This component is optional, in case you don't want to implement your own database.)
  5. ImageUtils: Handles the image format conversion, in case the integrator must change the image format or import an image.
  6. LicenseManager: Handles the license management. Refer to License Manager for more details.

Access to DocumentCaptureHandler is through the Document Capture SDK entry points. To learn how to use DocumentCaptureHandler, refer to the DocumentCaptureHandler section for more details.

Design considerations 

  • User permissions must be handled by the integrator. You must check that the app permissions are granted by the user if the Android version is higher than 23 (as detailed here).

  • Remember: You must always have a valid license before using any method of this SDK. You can activate it through LicenseManager. Refer to License Manager for more details.

  • Note: If your app is to run in low memory devices, you must add android:largeHeap="true" to your application.

  • If you find that your project requires other native libraries, you must add in your gradle.properties file the following filter:

XML
1android.useDeprecatedNdk=true

And in your build.gradle add filters for the desired ABI. For now, the SDK supports armeabi-v7a and arm64-v8a:

XML
1defaultConfig {....ndk.abiFilters 'armeabi-v7a','arm64-v8a'}

Prerequisites 

Skills required

The integration tasks should be done by developers with knowledge of:

  • Android Studio
  • Java for Android
  • Android OS

Resources required

Integration may be performed on computers running Windows, Linux, or macOS.

The tools required are:

  • Android Studio
  • Android SDK tools: preferred latest version
  • JDK: preferred latest version
  • Android device (emulator is not supported)
  • Minimum SDK version is 21

Biometric capture SDK structure 

The SDK's structure is displayed below.

Intro_BioSDKStructure

Tips 

App size optimization

After adding the SDK to your project you will observe that the size of application has grown significantly. This is because the SDK now includes native libraries for two ABIs: armeabi-v7a and arm64-v8a. What is generated is an .apk file that deploys to Google Play. Your application will contain both application binary interfaces even if one is not used.

Android App Bundle is the solution for this issue. Instead of generating an .apk, it is possible to generate a bundle (.aab). When a user installs the application from the store that contains the bundle, only the required components for the user's specific device will be downloaded.

Additionally, the maximum size of the bundle increases to 150 MB (100 MB is still maximum size for .apk files).

No changes on Google Play are required - just upload .aab instead of .apk. Also, no development in the application project is required.

It is recommended that the bundle options be declared inside the Gradle file, for example:

XML
1android {
2 ...
3 bundle {
4 density {
5 enableSplit true
6 }
7 abi {
8 enableSplit true
9 }
10 language {
11 enableSplit false
12 }
13 }
14}

More about app bundles can be found here.

License manager 

The purpose of this section is to show the API of the license management portion of the SDK, and expose the objects involved.

License manager 

The License manager is the main entry point to use the SDK. You can manage licenses through LicenseManager.

Note: A valid license is required before using any feature of the SDK.

provideLicenseManager

This method provides an instance of LicenseManager with a predefined LKMS profile. Operetion with LicenseManager should be executed before starting capture.

Kotlin
1val manager = LicenseManager.provideLicenseManager(LkmsProfileId, LkmsApiKey, lkmsUrl)

Activating license

This function takes care of making sure a valid license is stored on the device. This process is crucial and must occur each time before any SDK usage. In most cases it does not require any effort from integrator side. However, it might fail in some corner cases that are listed below.

Method handles license management on calling thread.

Callback solution:

Kotlin
1val activationResult = manager.activate(
2 object: LicenseActivationListener {
3 override fun onLicenseActivated() {
4 //License fetched and activated with success.
5 }
6
7 override fun onLicenseActivationFailed(licenseActivationError: LicenseActivationError) {
8 //Failed to fetch or activate the license.
9 }
10 },
11 applicationContext
12 )

Coroutines solution: It returns LicenseActivationResult

Kotlin
1val activationResult = manager.activate(applicationContext)
2 when(activationResult) {
3 is LicenseActivationSuccess -> {
4 //License fetched and activated with success.
5 }
6 is LicenseActivationError -> {
7 //Failed to fetch or activate the license.
8 }
9 }

LicenseActivationResult

This is information of result from activation license using coroutines solution. Instance might be type of:

LicenseActivationError

This is the information about why license can not be activated.

Attribute
Description
type ActivationErrorTypeThe type of error why license activation failed
message StringThe activation failure reason.

ActivationErrorType

Attribute
Description
PROFILE_EXPIREDProfile expired, all licenses won’t work anymore. (Contact with support)
ACTIVATION_COUNT_EXCEEDEDNo more licenses can be consumed. (Contact with support)
AUTHENTICATION_ISSUECredentials and/or profile information are wrong.
CONNECTION_ISSUEConnection issue. Make sure that your internet connection is stable.
UNKNOWNUnknown issue.

Introduction 

In order to make integration easier and more intuitive - new API has been delivered. It is based on use cases that are self-explaining which provide specific information depending on given use case. This allows to focus on working with data provided by SDK rather than on SDK configuration. What is more, some use cases allows to capture whole document (front and back sides) in single capture session - camera opens only once. More about use cases can be found here.

Integration 

Integration with new API is simple and consists of four steps.

  1. Add the SDK library to your app's build.gradle:
Groovy
1implementation("morpho.mph_bio_sdk.android:SmartDoc:$version")
  1. License activation and camera permission. In order to use SDK proper license has to be activated. License manager section shows how to handle license and permissions.

  2. Add DocumentCaptureView to the layout. This will be not only capture preview but also entry point to the SDK.

XML
1<com.idemia.capture.document.api.DocumentCaptureView
2 android:id="@+id/captureView"
3 android:layout_width="match_parent"
4 android:layout_height="match_parent" />

This view implements interface DocumentCapture which might be called to manage capture. It contains four methods: setUp(useCase: CaptureUseCase, lifecycle: Lifecycle), start(), stop(), destroy() .

Setting up is described below. Methods start, stop and destroy are similar to old API's methods to manage capture. However if Lifecycle instance has been passed during setup - there is no need to use these three methods - starting, stoping and destroying will be handled automatically.

  1. Use case creation. In order to start capture, specific use case instance needs to be created. Each use case have sessionInfo property that contains session configuration and set of listeners that might be applied in order to receive data from capture.

Once these three steps are satisfied, setUp method on CaptiveView might be called, passing use case instance as paramerer. If * Lifecycle* instance is also passed - there is no need to handle lifecycle methods of CaptureView (start/stop/destroy). Listeners attached to use case that has been previously created will provide data from capture.

Use cases 

Capture settings of DocumentCaptureSDK are done by using proper, predefined configuration designed for specific use case. In this way capture configuration is more intuitive and less confusing. Every use case take parameters only for this exact use case needs. In most cases it will be timeout value and listeners for capture feedback/result.

RemoteUseCase

This use case performs document capture with backend communication in order to allow manual verification of the document captured. In order to provide correct flow, FeedbackListener, RemoteListener and SessionInfo must be provided during RemoteUseCase initialization. FeedbackListener is mandatory to instruct user to properly place device during capture and also when to flip document if both sides are required for verification. RemoteListener informs about whole flow result and provides images of document captured. These images have to be approved in order to proceed with the process more detailed description might be found in listeners section. SessionInfo provides information about document capture session on IDEMIA Identity and Verification service for SDK needs to continue the flow.

It also contains field feedbackSamplingTime which can be used to define time between showing feedbacks for the capture.

SessionInfo field
Description
sessionId StringLive capture session id created with: v1/identities/{identityId}/id-documents/live-capture-session
apiKey StringApiKey for authorization on DocServer.
baseUrl StringUrl of document server - for example: https://idproofing-api.environment.idemia.io/doc-server/
Kotlin
1captureView.setUp(
2 RemoteUseCase(
3 feedbackListener,
4 adjudicationListener,
5 sessionInfo,
6 timeoutListener
7 ),
8 lifecycle
9)

Listeners 

Listeners available for specific use cases within new API for document capture.

RemoteListener

Listener dedicated to remote use cases. Two methods needs to be implemented to provide correct flow to the user.

  1. onDocumentCaptured(images: List<DocumentImage>, captureFinalizer: CaptureFinalizer) - this method is being called when document has been captured. List of images (front, back or both sides images) is returned. CaptureFinalizer instance allows to retry capture, cancel whole flow (Failure instance of Result will be returned on onResult method) or approve images which continues remote flow. Notice that CaptureFinalizer can retry capture which means that whole remote flow (including displaying captured document) must be performed on the same Activity where DocumentCaptureView is attached.

  2. onResult(result: Result) - returns result of remote flow. No other callback will occur after this method. Result might be type of * Success* or Failure.

Kotlin
1private val remoteListener = object : RemoteListener {
2 override fun onDocumentCaptured(
3 images: List<DocumentImage>,
4 captureFinalizer: CaptureFinalizer
5 ) {
6 //Handle captured document
7 }
8
9 override fun onResult(result: Result) {
10 when (result) {
11 is Failure -> //Handle failure result
12 is Success -> //Handle success result
13 }
14 }
15}

FeedbackListener

Returns feedback about current capture. Feedback should be displayed to user. Only one function to implement: onFeedback(feedback: CaptureFeedback), where CaptureFeedback is an enum telling about capture condition like: document is too far/too close to camera.

Kotlin
1private val feedbackListener = object : FeedbackListener {
2 override fun onFeedback(feedback: CaptureFeedback) {
3 //Present feedback to the user
4 }
5}

Time between feedbacks is defined (in seconds) by feedbackSamplingTime property of CaptureUseCase. By default it is 2 seconds.


CaptureTimeoutListener

Returns images in case of document capture timeout. Those images can be shown with associated _DocumentImageQualityIndicators to make another capture easeier. NOTE: _DocumentImageQualityIndicators from Failure are applicable ONLY for the last image returned on this callback!

Kotlin
1private val timeoutListener = CaptureTimeoutListener { documentImages ->
2 // Show images to the user
3 }

This listener is optional.

Errors 

For every flow there is possibility to receive Failure type from method onCaptureFinish in CaptureStateListener. It means that something went wrong during the capture or backend communication. Fortunately, Error object contains a lot of useful informations that help to handle failed flow.

Failure

Parameter
Description
type FailureTypeType of an error. High level information what goes wrong. Find types description below.
code IntSpecial code dedicated for particular case. Very helpful in L2, L3 troubleshooting.
message StringMessage with error description.
qualityIndicators DocumentImageQualityIndicators?Contains information what went wrong if document was not captured before timeout.

FailureType

Type
Description
CONNECTION_ISSUEGeneral issue with connection. See message and error code for more informations.
AUTHENTICATIONBackend authentication failed. Probably wrong credentials has been used for the given environment.
INVALID_SESSIONSession ID is not correct. Most probably session expired or has been finished.
TIMEOUTTimeout occured during the flow.
BAD_CAPTURECapture failed. Face was not detected or liveness check did not pass.
UNKNOWNUnknow type of exception. Also used as default type for few cases.
CANCELEDFlow has been canceled. Can be triggered by integrator or automatically when Lifecycle has been passed to setUp method.
INVALID_LICENSELicense validation failed. Make sure that it has been activated with LicenseManager

DocumentImageQualityIndicators

This object contains failure reasons of the capture.

Parameter
Description
badFraming BooleanIndicates if there was a problem with detecting entire document
blur BooleanIndicates if document was blurred
glare BooleanIndicates if reflections were detected
tooClose BooleanIndicates if document was too close from the camera
tooFar BooleanIndicates if document was too far from the camera
notStraight BooleanIndicates if document was straight
lowLight BooleanIndicates if lightning conditions were good enough
badConsistency BooleanIndicates if enough consecutive good frames were detected for document
pdf417BadDecoding Boolean?Indicates if pdf417 was detected. null if pdf417 is not mandatory for the document
mrzBadDecoding Boolean?Indicates if mrz was detected. null if mrz is not mandatory for the document
qrCodeBadDecoding Boolean?Indicates if QR code was detected. null if QR code is not mandatory for the document

Document capture - local 

Getting Started 

The guide illustrates the necessary steps to configure and use a minimally viable project to read documents using the CaptureSDK.

Downloadable sample app are at Document autocapture.

To create your own app:

  1. Add the SDK library to your app's build.gradle:
Groovy
1implementation("morpho.mph_bio_sdk.android:SmartDoc:version")

If you do not have configured repository for the SDK yet, see introduction that explains how to do that.

  1. Add the CaptureView to the layout where you handle the biometric capture:
XML
1<com.idemia.smartsdk.preview.CaptureView android:id="@+id/captureView" android:layout_width="match_parent"
2 android:layout_height="match_parent" />
  1. On your activity or fragment get a reference to this view:
Java
1CaptureView cameraPreview = (CaptureView) findViewById(R.id.captureView);
  1. Activate your license. This can be done in the onCreate(Bundle savedInstanceState) or in a previous stage of your app. This must be done only once.
Kotlin
1val manager = LicenseManager.provideLicenseManager(LkmsProfileId, LkmsApiKey, lkmsUrl)
2 val activationResult = manager.activate(applicationContext)
3 when(activationResult) {
4 is LicenseActivationSuccess -> {
5 //License fetched and activated with success.
6 }
7 is LicenseActivationError -> {
8 //Failed to fetch or activate the license.
9 }
10 }

For security reasons it is good to consider storing LKMS credentials outside source code (for example gradle properties).

  1. In the onResume() method of your activity or fragment, you must obtain a valid reference of the IDocumentCaptureHandler.
Java
1protected void onResume() {
2 //Sample configuration
3 //The activate process was OK.
4 // Populate a CaptureOptions object
5 IDocumentCaptureOptions captureOptions = new DocumentCaptureOptions(
6 new DocumentCaptureModeConfiguration {
7 public DocumentMode provideCaptureMode() {
8 return DocumentMode.READ_MRZ
9 }
10 });
11 captureOptions.setCamera(Camera.REAR);
12 captureOptions.setOverlay(Overlay.ON);
13 captureOptions.setCaptureTimeout(120);
14 BioSdk.createDocumentCaptureHandler(activity, captureOptions, new MscAsyncCallbacks<IDocumentCaptureHandler>() {
15 @Override
16 public void onPreExecute() {
17 // Optional hook on the builtin Android AsyncTask callback `onPreExecute`
18 }
19 @Override
20 public void onSuccess(IDocumentCaptureHandler result) {
21 // Indicates that initialization succeeded, the returned handler can be used to start the capture.
22 }
23 @Override
24 public void onError(BioCaptureHandlerError e) {
25 // An error has occurred during the initialization
26 }
27 });
28 super.onResume();
29 }
  1. Add the listeners for the events to the handler.
Java
1//MRZ callbacks
2captureHandler.setDocumentCaptureListener(new DocumentCaptureListener() {
3 @Override
4 public void onCaptureImageDocument(DocumentImage image) {
5 //If rectification is enabled we will receive several callbacks to this method (One per image, DATA_PAGE, PORTRAIT…)
6 //Document image captured
7 try {
8 byte[] jpegImage = image.getJPEGImage(); Bitmap documentImage = BitmapFactory.decodeByteArray(jpegImage, 0, jpegImage.length);
9 //show the document image
10 }
11 catch (Exception e){
12 Log.e(TAG, "", e);
13 }
14 //If rectification is disabled and we want to get all the images encoded into the location coordinates of the image
15 List<DocumentImage> croppedImages = ImageUtils.extractImages(image);
16 }
17 @Override
18 public void onCaptureFieldImageDocument(DocumentImage image, String labelName) {
19 //A field has been coded
20 }
21 @Override
22 public void onMRZDocumentRead(List<IMRZLine> mrzLines, IMrzRecord mrzRecord) {
23 //MRZ captured
24 }
25 @Override
26 public void onDocumentCaptureFailure(DocumentCaptureError captureError, DocumentImageQualityIndicators indicators) {
27 //Capture failed
28 }
29 @Override
30 public void onCaptureFinish() {
31 //Capture finished
32 }
33});
34//Barcode callbacks
35captureHandler.setBarcodeListener(new BarcodeListener() {
36 @Override
37 public void onBarcodeRead(List<String> capture) {
38 //Barcode captured
39 }
40 @Override
41 public void onDocumentCaptureFailure(DocumentCaptureError captureError, DocumentImageQualityIndicators indicators) {
42 //Capture failed
43 }
44 @Override
45 public void onCaptureFinish() {
46 //Capture finished
47 }
48});
49//Capture feedback listener
50captureHandler.setDocCaptureFeedbackListener(new DocumentCaptureFeedbackListener() {
51 @Override
52 public void onCaptureInfo(DocCaptureInfo docCaptureInfo) {
53 //Document captures info
54 }
55});
56//Tracking listener
57captureHandler.setDocumentTrackingListener(new DocumentCaptureTrackingListener() {
58 @Override
59 public void onTracking(List<MorphoDocumentRegion> trackingInfo) {
60 //Tracking info
61 }
62});
  1. Initialize the preview and capture to start the receive events.
1 captureHandler.startPreview(new PreviewStatusListener() {
2 @Override
3 public void onStarted() {
4 try {
5 captureHandler.startCapture();
6 } catch (MSCException e) {
7 // handle exception
8 }
9 }
10
11 @Override
12 public void onError(PreviewError error) {
13 // Preview initialization failed and can not be started
14 }
15 });
  1. Destroy the handler when onPause() is invoked.
Java
1@Override
2 protected void onPause() {
3 if (captureHandler != null) {
4 captureHandler.destroy();
5 }
6 super.onPause();
7 }
  1. If you must force a document capture:
Java
1if (captureHandler!=null) {
2 //Force a document capture
3 captureHandler.forceCapture();
4}
  1. In your manifest you must add:
XML
1<!--Declare new permissions-->
2 <permission
3 android:name="your.new.permission.NEW_READ_MPH_BIO_SDK_PROVIDER"
4 android:protectionLevel="signature" /> <!--unless otherwise required, set the maximum security permission -->
5 <permission
6 android:name="your.new.permission.NEW_WRITE_MPH_BIO_SDK_PROVIDER"
7 android:protectionLevel="signature" /> <!--unless otherwise required, set the maximum security permission -->
XML
1<!--The provider must be defined by the implementing app so as to allow multiple apps-->
2<!--Bio store provider-->
3<provider
4 android:name="com.morpho.mph_bio_sdk.android.sdk.content_provider.BioStoreProvider"
5 android:authorities="your.new.authority"
6 android:readPermission="your.new.permission.NEW_READ_MPH_BIO_SDK_PROVIDER"
7 android:writePermission="your.new.permission.NEW_WRITE_MPH_BIO_SDK_PROVIDER"
8 tools:replace="android:authorities, android:readPermission, android:writePermission">
9</provider>
  1. You must also set to landscape the orientation of the activity that will read MRZ:
XML
1<activity android:name="YOUR_ACTIVITY_NAME" android:screenOrientation="landscape"></activity>

Use cases

In order to get informations from capture, proper listeners have to be applied to DocumentCaptureHandler.

All use cases can retrieve data from:

  • DocumentCaptureFeedbackListener - provides information about capture conditions like: glare, too far/close to document etc.
  • DocumentCaptureTrackingListener - provides document coordinates on preview (coordinates are relative to preview frame size - not display size).
Read MRZ

This use case is used when the integrator wants to read the MRZ area of a document, such as those found on passports, but without retrieving the document. In such case listener: DocumentCaptureListener should be applied as it provides MRZ value read during capture.

capture_mrz
Read MRZ with document image

This use case is used when the integrator wants to read the MRZ area of a document, such as those found on passports. It also retrieves an image of the document.

In such case listener: DocumentCaptureListener should be applied as it provides MRZ value read during capture and document image itself.

capture_mrz_image.png
Capture a document image

This use case is used when the integrator wants to retrieve an image of the document.

In such case listener: DocumentCaptureListener should be applied as it provides document image that has been captured. If capture did not finish successfully before timeout, it returns best frame from acquisition attempt.

capture_document_image
Read a QR code

This use case is used when the integrator wants to read a QR Code.

To get QR code or PDF417 data use listeners:

  • BarcodeListener - to get data as String
  • BarcodeRawDataListener - to get data as ByteArray
capture_barcode

Create a DocumentCaptureHandler

This retrieves a capture handler to perform all the document capture operations. You must first configure the capture options.

  • Check the use case named Read MRZ.

  • Also, check all the features provided by this handler.

Java
1// Get activity from application
2 Activity activity = ...
3 // Populate a CaptureOptions object
4 IDocumentCaptureOptions captureOptions = new DocumentCaptureOptions(
5 new DocumentCaptureModeConfiguration {
6 public DocumentMode provideCaptureMode() {
7 return DocumentMode.READ_MRZ;
8 }
9 });
10 captureOptions.setCamera(Camera.REAR);
11 captureOptions.setOverlay(Overlay.ON);
12 captureOptions.setCaptureTimeout(120);
13 captureOptions.enableSingleShootCapture();
14 captureOptions.setUhdResolutionEnabled(true);
15 BioSdk.createDocumentCaptureHandler(activity, captureOptions, new MscAsyncCallbacks<IDocumentCaptureHandler>() {
16 @Override
17 public void onPreExecute() {
18 // Optional hook on the builtin Android AsyncTask callback `onPreExecute`
19 }
20 @Override
21 public void onSuccess(IDocumentCaptureHandler result) {
22 // Indicates that initialization succeeded, the returned handler can be used to start the capture.
23 }
24 @Override
25 public void onError(DocumentCaptureHandlerError e) {
26 // An error has occurred during the initialization
27 }
28 });
Parameter
Description
activity ActivityThe Android activity.
options IDocumentCaptureOptionsThe capture options to configure the document capture handler.
callbacks MscAsyncCallbacksCallbacks to be executed depending on the result.

Errors 

Error code
Description
MSC_ERR_APPLINOTAVAILABLEThe application parameter is not available.
MSC_ERR_GRAPH_INITIALISATION_FAILEDThe graph initialization failed.
MSC_ERR_INITInitialization failed.
MSC_ERR_PARAMETERSThe parameters are invalid.
MSC_ERR_PARAMETER_NOT_FOUNDThe parameter is missing.
MSC_ERR_PARAMETER_SIZEThe parameter size is incorrect.
MSC_ERR_PARAMETER_UNKNOWNOne of the parameters is unknown.
MSC_ERR_INVALID_HANDLEThe handle is invalid.
LIBS_NOT_FOUNDThe java libraries are not found.
NO_CONTEXT_SETThe java context is not set.
NOT_EXECUTEDThe java is unable to execute.
MSC_ERR_LICENSEThe license is invalid.
MSC_ERR_MEMALLOCThe memory allocation issue.
MSC_ERR_PROFILENOTAVAILABLEDocumentCapture profile is not available.
MSC_ERR_SUBPROFILENOTAVAILABLEDocumentCapture sub-profile is not available.
MSC_ERR_TYPE_MISMATCHDocumentCapture type mismatch .
UNKNOWNUnknown error.

Document capture handler 

You must retrieve the capture handler through Create DocumentCaptureHandler.

Document capture listener

This sets the listener to receive the captures.

The events of the capture process are reported to the integrator app through this listener, as shown in the snippet below:

Java
1captureHandler.setDocumentCaptureListener(new DocumentCaptureListener() {
2 @Override
3 public void onCaptureImageDocument(DocumentImage image) {
4 //Document image captured
5 try {
6 byte[] jpegImage = image.getJPEGImage();
7 Bitmap documentImage = BitmapFactory.decodeByteArray(jpegImage, 0, jpegImage.length);
8 //show the document image
9 }catch (Exception e){
10 Log.e(TAG, "", e);
11 }
12 }
13 @Override
14 public void onCaptureFieldImageDocument(DocumentImage image, String labelName) {
15 //A field has been coded
16 }
17 @Override
18 public void onMRZDocumentRead(List<IMRZLine> mrzLines) {
19 //MRZ captured
20 }
21 @Override
22 public void onDocumentCaptureFailure(DocumentCaptureError captureError, DocumentImageQualityIndicators indicators) {
23 //Capture failed
24 }
25 @Override
26 public void onCaptureFinish() {
27 //Capture finished
28 }
29 });

Barcode capture listener

This sets the listener to receive the barcode captures. The events of the capture process are reported to the integrator app through this listener.

There are two types of listeners: text data and raw data.

Java
1//Barcode callbacks for text data
2 captureHandler.setBarcodeListener(new BarcodeListener() {
3 @Override
4 public void onBarcodeRead(List<String> capture){
5 //Barcode captured
6 }
7 @Override
8 public void onDocumentCaptureFailure(DocumentCaptureError captureError, DocumentImageQualityIndicators indicators) {
9 //Capture failed
10 }
11 @Override
12 public void onCaptureFinish() {
13 //Capture finished
14 }
15 });
Java
1//Barcode callbacks for raw data
2 captureHandler.setBarcodeListener(new BarcodeListener(){
3 @Override
4 public void onBarcodeRead(RTBuffer capture){
5 //Barcode captured
6 }
7 @Override
8 public void onDocumentCaptureFailure(DocumentCaptureError captureError, DocumentImageQualityIndicators indicators) {
9 //Capture failed
10 }
11 @Override
12 public void onCaptureFinish() {
13 //Capture finished
14 }
15 });

Only one listener can be active at a time.

Feedback listener

This sets the listener to receive feedback, like moving a face to the right.

Java
1captureHandler.setDocCaptureFeedbackListener(new DocumentCaptureFeedbackListener() {
2 @Override
3 public void onCaptureInfo (DocCaptureInfo docCaptureInfo){
4 //Document captures info
5 }
6});

VideoRecordingReadyForGenerationListener

This sets the listener for a document to get VideoRecording. This listener is called when recording is enabled. It is called on successful and failed capture.

Set callback as shown in the snippet:

Java
1captureHandler.setVideoRecordingReadyForGenerationListener(new VideoRecordingReadyForGenerationListener() {
2
3 @Override
4 public void videoRecordingReadyForGeneration(VideoRecording videoRecording) {
5 //Video recording object to generate video
6 }
7 });

Callback returns VideoRecording object to generate video from capture.

Start preview

Asynchronously starts the camera preview.

It is recommended to start the capture once the preview has been initialized, as shown in the snippet:

1handler.startPreview(new PreviewStatusListener() {
2 @Override
3 public void onStarted() {
4 try {
5 captureHandler.startCapture();
6 } catch (MSCException e) {
7 // handle exception
8 }
9 }
10
11 @Override
12 public void onError(PreviewError error) {
13 // Preview initialization failed and can not be started
14 }
15 });

Stop preview

This stops the camera preview as shown in the snippet:

Java
1handler.stopPreview();

Start capture

This starts the biometric capture as shown in the snippet.

Java
1handler.startCapture();

Stop capture

This stops the biometric capture as shown in the snippet:

Java
1handler.stopCapture();

Switch camera

This switches between different cameras as shown in the snippet:

Java
1handler.switchCamera(Camera.FRONT); // Use front camera
2handler.switchCamera(Camera.REAR); // Use rear camera

Destroy

This releases all the handler resources as shown in the snippet:

Java
1handler.destroy();

Overlay

This sets the overlay option as shown in the snippet:

Java
1handler.setOverlay(Overlay.OFF); // Disable preview's overlay
2handler.setOverlay(Overlay.ON); // Enable preview's overlay

CaptureOptions

This retrieves the capture options used in this handler, as shown in the snippet:

Java
1IDocumentCaptureOptions options = handler.getCaptureOptions();

Force capture

This forces a capture as shown in the snippet:

Java
1handler.forceCapture();

Capture handler status

This retrieves the status of the capture handler as shown in the snippet:

Java
1CaptureHandlerStatus captureHandlerStatus = handler.getCaptureStatus();

Note: Refer to CaptureHandlerStatus.

Analytics 

Capture SDK offers a logging mechanism that collects analytics data about SDK usage, and sends this data to IDEMIA's server. This data helps IDEMIA to improve Capture SDK and the likelihood of integrator success within the app. It is strongly recommended to activate the analytics mechanism.

  • You can enable or disable sending analytics data.
  • You can choose to send analytics data only when you are connected to a Wi-Fi network, so as not to not use your cellular connection.
  • Analytics data that IDEMIA collects contains only technical data.
  • No sensitive personal data is collected.
  • IDEMIA does not collect any images.

Analytics data that we collect include following information:

  • Application name, bundle id, version
  • Capture SDK and RemoteLogger libraries versions
  • Device model and operating system version
  • Technical information about performed face, finger, and document capture (such as: capture mode used; timestamp; reason of error; time needed to perform a capture; quality of captured image; and light condition)
  • Technical information about performed authentication and identification events (such as: used threshold, duration, and obtained score)
  • Other technical information (such as: image compression, occurred errors, and SDK performance) that does not contain personal data

You can disable analytics reporting using the appropriate SDK method.

Helper objects 

Get debug data

You can save some captured data on a device's memory. In some cases, those files might help to solve some issues. Data can be found on the SD card in the SmartSDK_debug_data directory.

An example on how to configure the debug data options is shown in the snippet:

Java
1[...]
2 DebugSettingsBuilder debugSettingsBuilder = new DebugSettingsBuilder();
3 debugSettingsBuilder.logLevel(logLevel)
4 .storingType(DataStoringType.LAST_SESSION_ONLY)
5 .recordRtv(DebugOption.DISABLED)
6 .recordPostMortemRtv(DebugOption.DISABLED)
7 .saveCapturedImages(DebugOption.DISABLED);
8 captureOptions.setDebugDataSettings(debugSettingsBuilder.build());

DataStoringType can have two values: LAST_SESSION_ONLY and MULTIPLE_SESSIONS. The first one overwrites data in a single directory. The second makes a separate directory per capture.

There is also an option to store a special .rtv file that helps you understand what is happening during the capture.

Note: These files take a lot of space. LogLevel describes what part of the logs will be saved to a file. If needed, the integrator can also save captured images by enabling the saveCapturedImages option.

BioSdk class - enableAnalytics

This method turns on the reporting and sending analytics report. It also changes the analytics server and its API key.

NOTE: The server is set to Europe by default.

Parameter
Description
network NetworkPreferred network type that will be used to send the report.
analyticsConfigurationData AnalyticsConfigurationDataClass that allows the setting of SERVER URL and API KEY.

BioSdk class - disableAnalytics

This turns off the reporting and sending analytics report.

Note: By default, the analytics mechanism is turned on and the server is set to Europe.

This section describes the helper objects that are necessary to use the Biometric Capture SDK.

MscAsyncCallbacks

Generic callbacks which execute task asynchronous.

Function
Kotlin
1fun onPreExecute() {
2
3}
Function
Kotlin
1fun onSuccess(result: T) {
2 //on success
3}
Arguments
Parameter
Description
result Treturn on success with result type set when callback was created
Function
Kotlin
1fun onError(e: BioCaptureHandlerError) {
2 //on success
3}
Arguments
Parameter
Description
e BioCaptureHandlerErrorAn error

IBioSdkInfo

This object exposes information about the SDK.

Parameter
Description
version StringThe version of the SDK.

DocumentCaptureOptions

This object is used to configure the behavior of the DocumentCapture.

Attribute
Description
captureMode DocumentCaptureModeThe app enum option to configure the capture.
camera CameraThe app camera option to configure the capture.
overlay OverlaySets the overlay value.
captureTimeout LongCaptures the timeout in seconds (default value 120).
captureImageTimeout LongSets the image capture timeout. This timeout is used to force the capture of an image in the time given or fail. (-1 disables it, by default it is disabled).
logLevel LogLevelSets the log level.
DebugDataSettings Debug DataSets the debug data options that stores key information about a capture on the device's memory.
rectification RectificationSets image rectification. Enabled by default.
acquisitionMode AcquisitionModeSets the speed/quality balance during a document capture.
minDPI intMinimum resolution in dpi of the datapage captured. Possible value from 1 to 400.
stillShootEnable BooleanWhen enabled, the document image is taken with a single shot with higher resolution. If not, best image from video stream is taken.
videoRecordingOptions VideoRecordingOptionsWhen enabled, CaptureSDK returns VideoRecording to generate video from the taken capture. (By default video recording is disabled.)
uhdResolutionEnabled BooleanWhen enabled, the document capture will be started in UltraHD resolution. Otherwise FullHD will be used. Enabled by default.
feedbackSamplingTime Long

IImage

This is the image interface that the SDK image objects extend.

Parameter
Description
buffer byte[]The image.
stride intThe stride of the biometric.
width longThe width of the image.
height longThe height of the image.
colorSpace ColorSpaceThe ColorSpace of the image.
resolution floatThe resolution of the image.
imageQuality intImage quality if available, otherwise -1. Currently only available for fingerprint images.
labelLabel associated with this image, if any. It can be 'null'
toJPEG byte[]Retrieves the image as a JPEG image. Default quality for that document is 70%. The created JPEG for the document will contain capture maker note data inside EXIF metadata, containing information such as the SDK version used for capturing the image.
toJPEG(float quality)Retrieves the image as a JPEG image with quality valued from '0' to '1'

IDocumentImage

This is the document image interface that the SDK document image objects extend. It extends from IImage, but getImageQuality() method of IImage will always return -1 for document image.

Parameter
Description
documentRegions ListA list of the different regions with their coordinates of the document
within the image. It can be null or empty. You only receive them if you select READ_MRZ_DOCUMENT_IMAGE_HIGH and rectification
is DISABLE.
documentLocation DocumentLocationZone in the document to locate specific data, such as a photo or MRZ.
codedMode CodedModeIndicates how this image was triggered.
docLevel DocLevelGives information concerning the confidence of the information returned.

DocumentImageQualityIndicators

This object contains failure reasons of the capture.

Parameter
Description
badFraming BooleanIndicates if there was a problem with detecting entire document
blur BooleanIndicates if document was blurred
glare BooleanIndicates if reflections were detected
tooClose BooleanIndicates if document was too close from the camera
tooFar BooleanIndicates if document was too far from the camera
notStraight BooleanIndicates if document was straight
lowLight BooleanIndicates if lightning conditions were good enough
badConsistency BooleanIndicates if enough consecutive good frames were detected for document
pdf417BadDecoding DocumentImageQualityIndicatorIndicates if pdf417 was detected
mrzBadDecoding DocumentImageQualityIndicatorIndicates if mrz was detected

MorphoDocumentRegion

This object contains the coordinates of the document.

Parameter
Description
point1 PointFPoint 1 (Top left)
point2 PointFPoint 2 (Top right)
point3 PointFPoint 3 (Bottom right)
point4 PointFPoint 4 (Bottom left)
documentLocation DocumentLocationZone in the document to locate specific data, such as a photo or MRZ.
previewRect RectThe original preview size to which the coordinates are referred.

IMrzRecord

The MRZ record that interfaces with the SDK MRZ record objects that are extended.

Parameter
Description
morphoMrzDocumentCode MorphoMrzDocumentCodeThe document code.
morphoMrzDocumentFormat MorphoMrzDocumentFormatThe document format.
morphoMrzSex MorphoMrzSexGender
code1 charMRZ code 1
code2 charMRZ code 2
issuingCountry StringIssuing country
documentNumber StringDocument number
surname StringSurname
surname StringSurname
givenNames StringGiven names
dateOfBirth CalendarDate of birth
expirationDate CalendarExpiration date

IMrzFrenchIdCardRecord

The MRZ record interface for French identity cards. It extends IMrzRecord.

Parameter
Description
optional StringOptional data

IMrzMRPRecord

The MRZ record interface for MRP cards. It extends IMrzRecord.

Parameter
Description
personalNumber StringPersonal number

IMrzMrtdTd1Record

The MRZ record interface for MRTD TD1 cards. It extends IMrzRecord.

Parameter
Description
optional StringOptional data
optional2 StringOptional data

IMrzMrtdTd2Record

The MRZ record interface for MRTD TD2 cards. It extends IMrzRecord.

Parameter
Description
optional StringOptional data

IMrzMrvARecord

The MRZ record interface for MRV A cards. It extends IMrzRecord.

Parameter
Description
optional StringOptional data

IMrzMrvBRecord

The MRZ record interface for MRV B cards. It extends IMrzRecord.

Parameter
Description
optional StringOptional data

IMrzSlovackId2_34Record

The MRZ record interface for Slovakian identity cards. It extends IMrzRecord.

Parameter
Description
optional StringOptional data

GenericDocumentCaptureListener

This is a generic capture listener.

onDocumentCaptureFailure

This is invoked if DocumentCaptureHandler fails to do a capture. Check DocumentCaptureError.

Function
Java
1void onDocumentCaptureFailure(@NonNull DocumentCaptureError captureError, @Nullable DocumentImageQualityIndicators indicators);
Arguments
Parameter
Description
captureError DocumentCaptureErrorAn error
indicators DocumentImageQualityIndicators?Contains information what went wrong if document was not captured before timeout. May be null.

onCaptureFinish

This is invoked by DocumentCaptureHandler when it finishes the capture process.

Function
Java
1void onCaptureFinish();

DocumentCaptureListener

This is the document capture listener that extends GenericDocumentCaptureListener.

onCaptureImageDocument

This is invoked if a successful document image has been captured. Check DocumentImage.

Function
Java
1void onCaptureImageDocument(DocumentImage image);
Arguments
Parameter
Description
image DocumentImageThe document image.

onCaptureFieldImageDocument

This is invoked if a document field has been captured. Check DocumentImage.

Function
Java
1void onCaptureFieldImageDocument(DocumentImage image, String labelName);
Arguments
Parameter
Description
image DocumentImageThe document image.
labelName StringThe name of the label detected. The label depends on the document detected.

onMRZDocumentRead

This is invoked by DocumentCaptureHandler when it finishes reading all the lines of an MRZ document. Check IMRZLine.

Function
Java
1void onMRZDocumentRead(List<IMRZLine> mrzLines, IMrzRecord mrzRecord);
Arguments
Parameter
Description
mrzLines ListA list of MRZ lines read.
mrzRecord IMrzRecordThe MRZ lines parsed in an object that helps to extract the information. It could be null, if the MRZ lecture doesn't follow the standards.

BarcodeListener

This is the barcode capture listener that extends GenericDocumentCaptureListener.

onBarcodeRead

This is invoked if a successful barcode has been read.

Function
Java
1void onBarcodeRead(List<String> capture);
Arguments
Parameter
Description
capture ListA list of lines read.
Function
Java
1void onBarcodeRead(RTBuffer capture);
Arguments
Parameter
Description
capture RTBufferRaw data of a barcode.

DocumentCaptureFeedbackListener

This is the capture feedback listener. This listener enables the app to receive feedback about the document captures, such as image blur.

onCaptureInfo

This is invoked multiple times by DocumentCapture to send feedback about the capture process to the app.

Function

An example snippet is shown:

Java
1void onCaptureInfo(DocCaptureInfo docCaptureInfo);
Arguments
Parameter
Description
docCaptureInfo DocCaptureInfoThe feedback.

DocumentCaptureTrackingListener

Tracking listener

This sets the listener to receive tracking information, such as where the biometric is located.

Java
1captureHandler.setDocumentTrackingListener(new DocumentCaptureTrackingListener() {
2 @Override
3 public void onTracking (List < MorphoDocumentRegion > trackingInfo) {
4 //Tracking info to know where the document is.
5 }
6});

IMRZLine

This interface represents a basic MRZ line.

Parameter
Description
lineNumber intThe line number of the MRZ read.
consorank intThe rank number of the MRZ read.
Text StringThe MRZ text line.
docLevel DocLevelGives information concerning the confidence of the information returned.

CaptureListener

This is a generic capture listener.

onCaptureFinish

This is invoked by DocumentCaptureHandler when the capture finishes.

Function

An example snippet is shown:

Java
1void onCaptureFinish();

VideoRecordingOptions

This object is used to configure the behavior of the VideoRecording. You cannot generate two or more videos at the same time.

Parameter
Description
recordingEnable booleanEnable video recording

VideoRecording

This object is used to generate video in MP4 format. On success, it return the path to the video. You can generate one video.

Java
1videoRecording.generateVideo(new VideoProgressListener() {
2
3 @Overide
4 void onFinish(String path) {
5 //When creating video comlete with success return path to video
6 }
7
8 @Overide
9 void progress(int progress) {
10 //Showing progress of generating video from 0 to 100
11 }
12
13 @Overide
14 void onError(VideoError error) {
15 //It's call when generating video failed or another video is current generating
16 }
17});

Enums 

ColorSpace

This is the colorspace enum.

Attribute
Description
Y8Grayscale 8bpp image.
Y16LEGrayscale 16bpp image (Little Endian).
BGR24Colour 24bpp BGR image (BMP like memory layout).
RGB24Colour 24bpp RGB image (reversed memory layout compared to RT_COLORSPACE_BGR24).

Camera

This is the enum used to configure the camera for the capture.

Attribute
Description
FRONTFront camera
REARRear camera

CameraFlash enum

This enum is used to configure the camera flash of the capture.

Attribute
Description
OFFCamera flash off
ONCamera flash on

Overlay

This is the enum used to configure the overlay for the capture.

Attribute
Description
OFFOverlay off
ONOverlay on

LogLevel

This enum controls the log level.

Attribute
Description
ERRORError log level or above
DEBUGDebug log level or above
WARNINGWarning log level or above
INFOInfo log level or above
DISABLEDisables logs

CaptureHandlerStatus enum

This enum retrieves the status of the capture handler.

Attribute
Description
STOPThe handler is stopped.
PREVIEWThe handler is in preview mode.
CAPTUREThe handler is in capture mode.

BioCaptureHandlerError

This enums gives information why msc async failed

Attribute
Description
MSC_ERR_PARAMETERSParameters are invalid.
MSC_ERR_PARAMETER_UNKNOWNParameter is missing
MSC_ERR_MEMALLOCMemory allocation issue
MSC_ERR_INITInitialization failed
MSC_ERR_GRAPH_INITIALISATION_FAILEDthe graph initialization failed
MSC_ERR_PARAMETER_NOT_FOUNDParameter is missing
MSC_ERR_PARAMETER_SIZEParameter size is incorrect
MSC_ERR_TYPE_MISMATCHMSC type mismatch
MSC_ERR_INVALID_HANDLEHandle is invalid
MSC_ERR_LICENSELicense is invalid
MSC_ERR_APPLINOTAVAILABLEthe application parameter is not available
MSC_ERR_PROFILENOTAVAILABLEMSC profile is not available
NOT_EXECUTEDJava is unable to execute
LIBS_NOT_FOUNDJava libraries are not found
NO_CONTEXT_SETJava context is not set
MSC_ERR_SUBPROFILENOTAVAILABLEMSC sub-profile is not available
MSC_ERR_UNKNOWNAn unknown error occurred
MSC_ERR_INVALID_OPERATIONThe operation is invalid
MSC_ERR_INCOMPATIBLE_API_VERSIONThe API version is incompatible, your application must be recompiled
MSC_ERR_PARAMETER_WRONG_TYPEParameter is not the right type
MSC_ERR_PARAMETER_NOT_SETParameter is not set in current scope
UNKNOWNUnknown error

Rectification

This is the enum used to configure the rectification for the capture.

Attribute
Description
DISABLERectification off
ENABLERectification on

DocumentCaptureMode

This is the enum used to configure the mode for the capture.

Attribute
Description
READ_MRZReads MRZ lines.
READ_MRZ_DOCUMENT_IMAGE_MEDIUMAllows the capture of an image at the device's best video resolution after MRZ reading.
QR_CODEReads a QR Code.
QR_CODE_PDF_417Reads PDF417.
CAPTURE_DOCUMENT_IMAGE_VERY_LOW_IDCaptures an image at the device's best video resolution of ID1, ID2, and ID3 documents.
CAPTURE_DOCUMENT_IMAGE_VERY_LOW_A4Captures an image at the device's best video resolution of an A4 document.
CAPTURE_DOCUMENT_IMAGE_BARCODE_VERY_LOW_ID1Captures an image and read a barcode at the device's best video resolution of ID1 documents.
CAPTURE_DOCUMENT_IMAGE_VERY_LOW_ID1Captures an image at the device's best video resolution of ID1 documents.

AcquisitionMode

This enum is used for configure document capture quality mode

Attribute
Description
LOWLow quality high speed
MEDIUMMedium quality medium speed
HIGHHigh quality low speed

DocumentCaptureError

This enum reports why the document capture fails.

Attribute
Description
UNKNOWNUnknown error
INVALID_MRZInvalid MRZ line read
CAPTURE_TIMEOUTCapture timeout
BAD_CAPTURE_BARCODEBarcode capture failed
BAD_CAPTURE_DOCUMENTDocument capture failed
BAD_CAPTURE_DOCUMENT_IMAGEDocument image capture failed

DocCaptureInfo

This enum reports the document capture information.

Attribute
Description
BADFRAMINGBad framing detected.
BLURBlur detected.
ENDSTILLPoint and shoot capture done.
STARTSTILLStart point and shoot capture.
SHAKINGShaking detected.
HOLD_STRAIGHTHold document straight.
REFLECTIONReflection detected.
TOO_FARThe document is too far.
TOO_CLOSEThe document is too close.
OKEverything is OK.
DOCUMENT_NOT_DETECTEDDocument not detected within an internal timeout.

DocumentLocation

This enum shows biometric locations.

Attribute
Description
DOC_MRZMRZ zone
DOC_DATAPAGEData page zone
DOC_PHOTOPhoto zone
DOC_REFLECTReflect zone
UNKNOWNUnknown

MorphoMrzDocumentCode

This enum retrieves the MRZ document code.

Attribute
Description
CREW_MEMBERCrew member code
MIGRANTMigrant code
PASSPORTPassport code
TYPE_ATYPE_A code
TYPE_CTYPE_C code
TYPE_ITYPE_I code
TYPE_VTYPE_V code

MorphoMrzDocumentFormat

This enum retrieves the MRZ document format.

Attribute
Description
FRENCH_IDFrench identity card
MRTD_TD1MRTD TD1
MRTD_TD2MRTD TD2
MRV_VISA_AMRV Visa A
MRV_VISA_BMRV Visa B
PASSPORTPassport
SLOVAK_ID_234Slovak identity card

MorphoMrzSex

This enum retrieves the MRZ document gender.

Attribute
Description
MALEMale gender
FEMALEFemale gender
UNSPECIFIEDUnspecified gender

CodedMode

This enum shows document image capture modes. These indicate how the image has been triggered.

Attribute
Description
NOMINALAll video quality criteria have been fulfilled and the best image is returned.
FORCEForce capture trigger has been used
TIMEOUTBest image returned on timeout

DocLevel

This enum gives information concerning the confidence of the information returned.

Attribute
Description
VERY_LOWCan be obtained with all profiles
LOWCan be obtained with high, medium, or low profiles
MEDIUMCan be obtained with high or medium profiles
HIGHCan be obtained with high profiles

DocumentImageQualityIndicator

This enums gives information about quality indicator

Attribute
Description
TRUEGiven indicator is not acceptable
FALSEGiven indicator is acceptable
NOT_APPLICABLEIndicator is not applicable for current capture mode

Compression recommendations 

The recommendations for document images are:

  • Send non-segmented images.
  • Compression is JPEG92
  • Size of image will be about 1 MB

An example snippet is shown:

Kotlin
1val JPEG_COMPRESSION_LEVEL = 92
2
3private fun prepareImage(image:ByteArray): ByteArray {
4 val byteArrayOutStream = ByteArrayOutputStream()
5 val documentBitmap = BitmapFactory.decodeByteArray(image, 0, image.size)
6 val result = documentBitmap.compress(Bitmap.CompressFormat.JPEG, JPEG_COMPRESSION_LEVEL, byteArrayOutStream)
7 documentBitmap.recycle()
8
9 return byteArrayOutStream.toByteArray()
10}

Remember to use only ImageUtils for any image transformation/compression - especially when IDEMIA backend is being used. The common mistake is to convert images to Android's Bitmap object (for UI purposes) and then send them to the backend. It might lead to some side effects, so please try to avoid this.

SDK size 

This is the estimated size of an SDK variant with all its dependencies, like predefined plugins (see Plugins section). The UI-extension is not included in size as it is not a predefined dependency.

SDK variant
Size
CaptureFace24.29 MB
CaptureDocument16.94 MB
CaptureFinger17.24 MB
CaptureBiometry28.78 MB
CaptureBiometry_document43.48 MB
CaptureFace_document38.99 MB

Plugins size 

Plugin
Size
plugin-face7.59 KB
plugin-face-normal6.75 MB
plugin-face-lite4.79 MB
plugin-face-cr2dmatching6.75 MB
plugin-finger794.64 KB
plugin-algorithm-f5-4-low7512.30 MB
plugin-algorithm-f5-0-vid814.08 MB
plugin-algorithm-f6-5-low707.45 MB
plugin-algorithm-fingerv91.51 KB
plugin-improved-pdf417-detection8.81MB