Android SDK
Getting Started
Latest Version:
Requirements
Device Requirement
Project Requirement
Shufti Pro SDK requires AndroidX 1.0.0 or later. If you haven't switched to AndroidX in your app yet then follow thisguide
Shufti Pro SDK requires Java 8 language features to be enabled in your project. If it is not already enabled, add this to your app/build.gradle file under the android section
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
Resources
Integration
SDK Integration Guide
It’s always recommended to use the updated version
Step 1
Go to root-level setting.gradle in your project and add the following:
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
maven { url 'https://jitpack.io' } // Add this line
}
}
allprojects {
repositories {
google()
mavenCentral()
maven { url 'https://jitpack.io' } // add this line
}
}
Step 2
In build.gradle(Module) enable dataBinding true.
android {
//Rest of your code
dataBinding {
enabled = true
}
}
Step 3
In build.gradle(Module) add the following implementation
implementation 'com.github.shuftipro:android-onsite-sdk:+'
Basic Usage
The following objects are necessary to initialise the SDK:
Make sure you have obtained authorization credentials before proceeding. You can get client id or secret key and generate access token like this.
1. Authorization
The following code snippet shows how to use the access token in auth object.
- Java
- Kotlin
JSONObject AuthKeys = new JSONObject();
try{
AuthKeys.put("auth_type","access_token");
AuthKeys.put("access_token","sp-accessToken");
} catch (JSONException e) {
e.printStackTrace();
}
val AuthKeys = JSONObject().apply {
put("auth_type", "access_token")
put("access_token", "sp-accessToken")
}
2. Configuration
The Shufti Pro’s mobile SDKs can be configured on the basis of parameters provided in the config object. The details of parameters can be found here
- Java
- Kotlin
JSONObject Config=new JSONObject();
try{
Config.put("base_url", "api.shuftipro.com");
Config.put("consent_age", 16);
} catch (JSONException e) {
e.printStackTrace();
}
val Config = JSONObject().apply{
put("show_requirement_page", false)
put("base_url", "api.shuftipro.com")
put("consent_age", 16)
}
3. Request Object
This object contains the service objects and their settings through which the merchant wants to verify end users. Complete details of service objects and their parameters can be found here
- Java
- Kotlin
JSONObject requestObject = new JSONObject();
try{
requestObject.put("reference", "Unique-Reference");
requestObject.put("country", "");
requestObject.put("language", "");
requestObject.put("email", "");
requestObject.put("callback_url", "");
requestObject.put("verification_mode", "image_only");
requestObject.put("show_results", "1");
requestObject.put("allow_retry", "0");
requestObject.put("show_ocr_form", "0");
//Creating Face object
JSONObject faceObject = new JSONObject();
faceObject.put("proof", "");
requestObject.put("face", faceObject);
//Creating Document object
JSONObject documentObject = new JSONObject();
ArrayList<String> doc_supported_types = new ArrayList<String>();
doc_supported_types.add("passport");
doc_supported_types.add("id_card");
doc_supported_types.add("driving_license");
doc_supported_types.add("credit_or_debit_card");
documentObject.put("proof", "");
documentObject.put("additional_proof", "");
JSONObject docNameObject = new JSONObject();
docNameObject.put("first_name", "Johon");
docNameObject.put("middle_name", "Johsan");
docNameObject.put("last_name", "Livone");
documentObject.put("name", docNameObject);
documentObject.put("dob", "1980-11-12");
documentObject.put("document_number", "19901112");
documentObject.put("expiry_date", "1996-11-12");
documentObject.put("issue_date", "1990-11-12");
documentObject.put("backside_proof_required", "1");
documentObject.put("supported_types",new JSONArray(doc_supported_types));
requestObject.put("document", documentObject);
//Creating Document Two Object is exactly same as document object.
// Add document two to request object like
...
requestObject.put("document_two", documentTwoObject);
//Creating Address object
JSONObject addressObject = new JSONObject();
ArrayList<String> address_supported_types = new ArrayList<String>();
address_supported_types.add("id_card");
address_supported_types.add("passport");
address_supported_types.add("bank_statement");
JSONObject addressNameObject = new JSONObject();
addressNameObject.put("first_name", "Johon");
addressNameObject.put("middle_name", "Johsan");
addressNameObject.put("last_name", "Livone");
addressObject.put("name", addressNameObject);
addressObject.put("proof", "");
addressObject.put("full_address", "ST#2, 937-B, los angles.");
addressObject.put("supported_types",new JSONArray(address_supported_types));
requestObject.put("address", addressObject);
//Creating consent object
JSONObject consentObject = new JSONObject();
ArrayList<String> consent_supported_types = new ArrayList<String>();
consent_supported_types.add("handwritten");
consent_supported_types.add("printed");
consentObject.put("proof", "");
consentObject.put("text", "This is my consent. ");
consentObject.put("supported_types",new JSONArray(consent_supported_types));
requestObject.put("consent", consentObject);
} catch (JSONException e) {
e.printStackTrace();
}
val requestObject = JSONObject().apply {
put("reference", "Unique-Reference")
put("country", "")
put("language", "")
put("email", "")
put("callback_url", "")
put("verification_mode", "image_only")
put("show_results", "1")
}
//Creating Face object
val faceObject = JSONObject()
faceObject.put("proof", "")
requestObject.put("face", faceObject)
//Creating Document object
val documentObject = JSONObject().apply {
put("supported_types", JSONArray().apply {
put("id_card")
put("passport")
put("driving_license")
put("credit_or_debit_card")
})
put("proof", "")
put("additional_proof", "")
put("name", JSONObject().apply {
put("first_name", "Johon")
put("middle_name", "Johsan")
put("last_name", "Livone")
})
put("dob", "1980-11-12")
put("document_number", "19901112")
put("expiry_date", "1996-11-12")
put("issue_date", "1990-11-12")
put("backside_proof_required", "0")
}
requestObject.put("document", documentObject)
//Creating Document Two Object is exactly same as document object.
// Add document two to request object like
...
requestObject.put("document_two", documentTwoObject)
//Creating Address object
val addressObject = JSONObject().apply {
put("supported_types", JSONArray().apply {
put("id_card")
put("passport")
put("bank_statement")
})
put("name", JSONObject().apply {
put("first_name", "Johon")
put("middle_name", "Johsan")
put("last_name", "Livone")
})
put("proof", "")
put("full_address", "ST#2, 937-B, los angles.")
}
requestObject.put("address", addressObject)
//Creating consent object
val consentObject = JSONObject().apply {
put("supported_types", JSONArray().apply {
put("handwritten")
put("printed")
})
put("proof", "")
put("text", "This is my consent. ")
}
requestObject.put("consent", consentObject)
Initialisation
Shufti Pro’s mobile SDK can be initialised by using the given method and passing auth, config and request object as the parameters.
- Java
- Kotlin
Shuftipro shuftipro = Shuftipro.getInstance();
shuftipro.shuftiproVerification(requestObject, AuthKeys, Config, MainActivity.this,
new ShuftiVerifyListener() {
@Override
public void verificationStatus(@NonNull Map<String, ?> responseSet) {
Log.e("Response",responseSet.toString());
}
});
val shuftipro = Shuftipro.getInstance();
shuftipro.shuftiproVerification(requestObject, AuthKeys, Config, this@MainActivity,
object : ShuftiVerifyListener {
override fun verificationStatus(responseSet: Map<String, Any>) {
Log.e("Response",responseSet.toString())
}
})
Callbacks
The SDK receive callbacks on termination, whether after the request completion or if the journey is left mid-way.The call backs are received in
- Java
- Kotlin
new ShuftiVerifyListener() {
@Override
public void verificationStatus(@NonNull Map<String, ?> responseSet) {
{
Log.e("Response",responseSet.toString());
// Handle callback responses here
}
}
shuftipro.shuftiproVerification(requestObject, AuthKeys, Config, this@MainActivity,
object : ShuftiVerifyListener {
override fun verificationStatus(responseSet: Map<String, Any>) {
Log.e("Response",responseSet.toString());
}
})
The complete list of callback events can be foundhere
Callback Handling
All the callbacks can be handled inside the client’s calling activity. The responses and callback handling can be seen below.
On SDK Completion
- Java
- Kotlin
if(responseSet.get("event").equals("verification.accepted")){
// Verification accepted callback
}
else if(responseSet.get("event").equals("verification.declined")){
// Verification declined callback
}
when (responseSet["event"])
{
"verification.accepted" -> Log.i("Response","accepted") // Verification accepted callback
"verification.declined" -> Log.i("Response","declined") // Verification declined callback
}
On SDK Unauthentication
- Java
- Kotlin
if(responseSet.get("event").equals("request.unauthorized")){
// Verification unauthorized callback. This event occurs when the auth header or its parameters are invalid.
}
if(it.get("event").equals("request.unauthorized")){
// Verification unauthorized callback. This event occurs when the auth header or its parameters are invalid.
}
On SDK Error
- Java
- Kotlin
if(responseSet.get("event").equals("permission.denied")){
// This callback is returned in case the permissions are declined by the end user.
}
else if(responseSet.get("event").equals("request.timeout")){
// This callback is returned in case request took too long and is timed out
}
else if(responseSet.get("event").equals("verification.cancelled")){
// This callback is returned when verification is cancelled midway by the end user
}
else if(responseSet.get("event").equals("request.invalid")){
// This callback is returned if the request parameters are incorrect.
}
else {
// Some error has been occured during the verification process
}
when (responseSet["event"])
{
"permission.denied" -> Log.i("Response","permission denied") // This callback is returned in case the permissions are declined by the end user.
"request.timeout" -> Log.i("Response","timeout") // This callback is returned in case request took too long and is timed out
"verification.cancelled" -> Log.i("Response","cancelled") // This callback is returned when verification is cancelled midway by the end user
"request.invalid" -> Log.i("Response","invalid request") // This callback is returned if the request parameters are incorrect.
else -> Log.i("Response", "error") // Some error has been occured during the verification process
}
Obfuscation
The ShuftiPro Android SDK already includes the required ProGuard rules, so there's no need to add them separately.
Make sure you have disabled R8 full mode in the gradle.properties file in release mode.
android.enableR8.fullMode=false
Customisation
ShuftiPro supports a set of customisation options that will influence the appearance of the mobile SDK.
UI Customisation
To customise the color scheme of the entire ShuftiPro mobile SDK, as well as the text and background colors of the widgets, you can utilize the following keys within the config object.
- Java
- Kotlin
JSONObject Config=new JSONObject();
try{
Config.put("base_url", "api.shuftipro.com");
Config.put("button_text_color", "#XXXXXX");
Config.put("button_primary_color", "#XXXXXX");
Config.put("button_secondary_color", "#XXXXXX");
Config.put("heading_color", "#XXXXXX");
Config.put("sub_heading_color", "#XXXXXX");
Config.put("theme_color", "#XXXXXX");
Config.put("icon_color", "#XXXXXX");
Config.put("background_color", "#XXXXXX");
Config.put("stroke_color", "#XXXXXX");
} catch (JSONException e) {
e.printStackTrace();
}
val Config = JSONObject().apply{
put("base_url", "api.shuftipro.com")
put("button_text_color", "#XXXXXX")
put("button_primary_color", "#XXXXXX")
put("button_secondary_color", "#XXXXXX")
put("heading_color", "api.shuftipro.com")
put("sub_heading_color", "#XXXXXX")
put("theme_color", "#XXXXXX")
put("icon_color", "#XXXXXX")
put("background_color", "#XXXXXX")
put("stroke_color", "#XXXXXX")
}
Localization
"language": "en". List of all languages are mention here
NFC verification
Near Field Communication (NFC) is a set of short-range wireless technologies. NFC allows sharing small payloads of data between an NFC tag and an NFC-supported device. NFC Chips found in modern passports and similar identity documents contain additional encrypted information about the owner. This information is very useful in verifying the originality of a document. NFC technology helps make the verification process simple, quicker and more secure. This also provides the user with contactless and input less verification. ShuftiPro's NFC verification feature detects MRZ from the document to authenticate NFC chips and retrieve data from it, so the authenticity and originality of the provided document could be verified.
Initialisation
build.gradle
dependencies {
implementation 'com.github.shuftipro:nfc-onsite:1.0.5'
}
To check NFC supported documents and countries, please clickhere
Nfc verification is allowed only on e-passports under document, document_two and address service only.
All-In-One SDK
A dynamic and efficient tool designed to transform user verification into a streamlined and effortless process. This powerful SDK enables the integration of multiple verification journeys using just a single line of code, catering to various user events and scenarios Our SDK automatically listens for the Journey you associate with a customer and initiates the verification process immediately.
Client Side
Step 1
Initialize the ShuftiPro SDK
To initialize the SDK, create a new instance of ShuftiPro and call the init method with initial data
val shuftiPro = Shuftipro.getInstance()
shuftiPro.register(clientId,customerID,configObject(),applicationContext,object : ShuftiVerifyListener {
override fun verificationStatus(responseSet: Map<String, Any>) {
Log.d("RequestResponse", responseSet.toString())
}
})
The details of parameters can be found [here](/docs/mobile/parameters/all-in-one-parameters).
Step 2
Destroying the SDK Instance
To clean up and destroy the SDK instance, call the destroy method.
shuftiPro.unRegister()
Server Side
Trigger verification Journey
This API triggers verification for a given customer (customer_id) with the provided verification journey (journey_id).
API Endpoint: https://api.shuftipro.com/create/customer/journey
Send the following payload to initiate the creation of a customer journey.
{
"journey_id" : "ULMTCqye1719840116",
"customer_id" : "TestingCustomer595"
"reference" : "123456789"
}
The details of parameters can be foundhere
You will receive the following response from the API call.
{
"error": false,
"message": "customer journey created successfully"
}
The details of parameters can be foundhere
Revision History
Date | SDK Versions | Description |
---|---|---|
Aug 19, 2024 | 1.4.5 | Improvement Added new service of Enhance Due Deligence. |
Sep 23, 2024 | 1.4.2 | Improvement Improve the SDK encryption and user experience. |
Sep 20, 2024 | 1.4.1 | Resolution Enhance the image picker functionality to handle cases where no picker app is available. |
Sep 19, 2024 | 1.4.0 | Improvement Improve the branding of shuftipro. |
Aug 27, 2024 | 1.3.9 | Improvement Improve the phrases in case of arabic langauge. |
Aug 19, 2024 | 1.3.8 | Improvement Added functionality to implement a white label solution. |
Aug 13, 2024 | 1.3.7 | Improvement Enhance face liveness detection by analyzing multiple frames and aggregating results for more accurate decision-making. |
Aug 12, 2024 | 1.3.6 | Improvement Improve the OCR Form in case of only nationality field in payload. |
Aug 05, 2024 | 1.3.5 | Improvement Improved the phrases translation in case of traditional Chinese language. |
Jul 31, 2024 | 1.3.4 | Improvement Update the design and user experience of the upload screen. |
Jul 30, 2024 | 1.3.2 | Improvement Fix the merchant logo issue in case of SVG image. |
Jul 19, 2024 | 1.3.1 | Improvement We are implementing the following features in the mobile SDK: 1. All in One SDK. 2. Added new service "AML for business". 3. Masking of Credit & Debit Card number in OCR form. 4. Show images on Retry Screen. 5. Reduce the loaders to improve the verification journey. |
Jul 12, 2024 | 1.3.0 | Resolution Introduce a "disable_storage_permission" key in the config object to conditionally remove storage permissions from the SDK. |
Jul 08, 2024 | 1.2.9 | Resolution Fetch country code list from an API to ensure data is always up-to-date, replacing static local lists. |
Jul 04, 2024 | 1.2.8 | Resolution Optimize API logic by centralizing error handling, adding retries, and using async calls. |
Jul 02, 2024 | 1.2.7 | Improvement We are implementing the following features in the mobile SDK: 1. Implement Journey Builder. 2. Added support of merchant logo at footer. |
Jun 12, 2024 | 1.2.6 | Improvement We are implementing the following features in the mobile SDK: 1. Enhanced instruction screen. 2. Addition of a nationality field in the OCR form. 3. Integration of NFC functionality. |
May 20, 2024 | 1.2.5 | Resolution Resolution of country flag issues during proof uploads. |
May 13, 2024 | 1.2.4 | Improvement Improved OCR form logic and enhanced data validation. |
May 09, 2024 | 1.2.3 | Improvement Enhanced the post detection of document scanning. |
May 03, 2024 | 1.2.2 | Improvement Improve your theme customization with the below new parameters: icon_color: Alter the color of icons within the SDK. background_color: Modify the background color of the SDK. stroke_color: Adjust the color of borders used within the SDK. shuftipro_light_icon: Customize the color of the Shuftipro icon in both light and dark modes. For further details, refer to the [customization](#customization) section in the documentation. |
Apr 24, 2024 | 1.2.1 | Improvement Enhanced the consent screen and improved the user experience of the SDK. |
Apr 23, 2024 | 1.2.0 | Improvement Incorporated Age parameter support into the document service. |
Apr 17, 2024 | 1.1.9 | Improvement We've implemented a new feature that eliminates the need for OCR inputs for background checks when the name and date of birth are extracted from the document service. This functionality can be activated upon request through ShuftiPro tech support. |
Apr 03, 2024 | 1.1.8 | Improvement Include a layout feature on the camera screen for both face and document services during video recording to enhance the presentation of evidence and improve the user experience. |
Mar 27, 2024 | 1.1.7 | Improvement Implemented a new feature for face liveness verification, requiring users to align their faces with multiple overlays to authenticate their identity. |
Mar 20, 2024 | 1.1.6 | Improvement A language selection sheet now includes the option for translated languages. |
Mar 15, 2024 | 1.1.5 | Improvement Included a new parameter called "loading_text" within the config object, enabling the modification of the loading text displayed at the initiation of the SDK. |
Mar 11, 2024 | 1.1.4 | Improvement Enhanced socket connection performance for improved reliability on limited internet connections. |
Mar 08, 2024 | 1.1.3 | Improvement Enhanced camera quality and added compatibility with multiple devices. |
Feb 23, 2024 | 1.1.2 | Improvements: 1. Enhanced SDK Design: Revamped the overall design of the SDK for improved usability and aesthetics. 2. Cropped Image Display: Incorporated the ability to display cropped images within the document service, enhancing user experience and clarity. 3. AutoCapture Countdown Timer: Integrated a countdown timer in AutoCapture mode for precise document placement within the designated rectangle, ensuring clear and accurate image capture. 4. Image Preview Zoom Functionality: Integrated a zoom feature in the image preview section, enabling users to examine images more closely. 5. Streamlined User Consent: Transitioned user consent from a full-screen display to a more user-friendly dialog box, enhancing accessibility and user interaction. 6. NFC Integration: Implemented Near Field Communication (NFC) functionality within the Onsite SDK, enabling seamless communication with NFC-enabled devices. Additions: 1. Phone and Email Service: Added new services for phone and email functionalities, expanding the range of verification options available within the SDK. |
Jan 30, 2024 | 1.1.0 | Improvement Change Phrase ID of ID Card from 1704 to 17 (National ID to ID Card) |
Jan 22, 2024 | 1.0.8 | Improvement Add missing keys in verification_data object in main response |
Jan 18, 2024 | 1.0.7 | Improvement Fix OCR Calendar issue in Arabic language. |
Dec 07, 2023 | 1.0.4 | Improvement Improved the camera functionality of low hardware devices. |
Dec 07, 2023 | 1.0.3 | Improvement Onsite SDK now offers an enhanced user interface along with improved features for localization, OCR Form, and a Retry Option. |