{"id":22972967,"url":"https://github.com/extrievetechnologies/quickcapture_android","last_synced_at":"2026-04-16T04:01:57.711Z","repository":{"id":165863458,"uuid":"628828415","full_name":"ExtrieveTechnologies/QuickCapture_Android","owner":"ExtrieveTechnologies","description":"QuickCapture Mobile Scanning SDK Specially designed for native ANDROID from Extrieve","archived":false,"fork":false,"pushed_at":"2026-01-30T05:05:47.000Z","size":603,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"QuickCapture-V4","last_synced_at":"2026-01-30T21:28:28.463Z","etag":null,"topics":["android","document-scanner","document-scanner-app","document-scanning-sdk","document-understanding","java","kotllin"],"latest_commit_sha":null,"homepage":"https://extrieve.com/mobile-document-scanning/","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ExtrieveTechnologies.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2023-04-17T04:13:40.000Z","updated_at":"2026-01-30T05:05:50.000Z","dependencies_parsed_at":"2023-07-20T01:00:42.066Z","dependency_job_id":"417e0d33-bbc0-4548-8008-b71be309b6ff","html_url":"https://github.com/ExtrieveTechnologies/QuickCapture_Android","commit_stats":null,"previous_names":["extrievetechnologies/quickcapture_android"],"tags_count":18,"template":false,"template_full_name":null,"purl":"pkg:github/ExtrieveTechnologies/QuickCapture_Android","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ExtrieveTechnologies%2FQuickCapture_Android","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ExtrieveTechnologies%2FQuickCapture_Android/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ExtrieveTechnologies%2FQuickCapture_Android/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ExtrieveTechnologies%2FQuickCapture_Android/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ExtrieveTechnologies","download_url":"https://codeload.github.com/ExtrieveTechnologies/QuickCapture_Android/tar.gz/refs/heads/QuickCapture-V4","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ExtrieveTechnologies%2FQuickCapture_Android/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31870516,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-15T15:24:51.572Z","status":"online","status_checked_at":"2026-04-16T02:00:06.042Z","response_time":69,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","document-scanner","document-scanner-app","document-scanning-sdk","document-understanding","java","kotllin"],"created_at":"2024-12-14T23:37:25.313Z","updated_at":"2026-04-16T04:01:57.698Z","avatar_url":"https://github.com/ExtrieveTechnologies.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n\u003cimg class=\"img-fluid\" align=\"center\" src=\"https://raw.githubusercontent.com/ExtrieveTechnologies/QuickCapture/main/img/QuickCapture.png\" width=\"30%\" alt=\"img-verification\"\u003e\u003cimg align=\"right\" class=\"img-fluid\" padding=\"10px\" src=\"https://raw.githubusercontent.com/ExtrieveTechnologies/QuickCapture/main/img/android.png\" alt=\"img-verification\"\u003e\n\u003c!-- \u003ca align=\"center\" href='https://play.google.com/store/apps/details?id=com.extrieve.exScan\u0026pcampaignid=pcampaignidMKT-Other-global-all-co-prtnr-py-PartBadge-Mar2515-1' title=\"Click to download android app\" target=\"_blank\" rel=\"noopener noreferrer\"\u003e\u003cimg align=\"center\" width=\"150px\" alt='Get it on Google Play' src='https://play.google.com/intl/en_us/badges/static/images/badges/en_badge_web_generic.png'/\u003e\u003c/a\u003e --\u003e\n\n\u003cp align=\"left\"\u003e\n  \u003ca href=\"https://github.com/ExtrieveTechnologies\"\u003e\u003cimg src=\"https://img.shields.io/badge/GitHub-Extrieve%20Org-181717?style=flat\u0026logo=github\" alt=\"GitHub Org\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/ExtrieveTechnologies/QuickCapture\"\u003e\u003cimg src=\"https://img.shields.io/badge/Repo-QuickCapture-blue?style=flat\u0026logo=github\" alt=\"QuickCapture Repo\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://www.extrieve.com\"\u003e\u003cimg src=\"https://img.shields.io/badge/Website-extrieve.com-0A66C2?style=flat\u0026logo=google-chrome\u0026logoColor=white\" alt=\"Web\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://www.linkedin.com/company/extrieve\"\u003e\u003cimg src=\"https://img.shields.io/badge/LinkedIn-Extrieve-0A66C2?style=flat\u0026logo=linkedin\u0026logoColor=white\" alt=\"LinkedIn\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://blog.extrieve.com/\"\u003e\u003cimg src=\"https://img.shields.io/badge/Blog-Extrieve%20Insights-FF6F00?style=flat\u0026logo=blogger\u0026logoColor=white\" alt=\"Blog\" /\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"left\"\u003e\n  \u003ca href=\"https://github.com/orgs/ExtrieveTechnologies/discussions\"\u003e\u003cimg src=\"https://img.shields.io/badge/Community-Discussions-purple?style=flat\u0026logo=github\" alt=\"Community\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/badges/shields/discussions\" alt=\"Discussions\"\u003e\u003cimg src=\"https://img.shields.io/github/discussions/badges/shields\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://contact.extrieve.com?ptype=QC-Android\"\u003e\u003cimg src=\"https://img.shields.io/badge/Contact-Talk%20to%20Us-success?style=flat\u0026logo=maildotru\u0026logoColor=white\" alt=\"Contact\" /\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n# Extrieve QuickCapture v4.2\n\u003cimg src=\"https://img.shields.io/badge/AI-KIMORA%20AI%20v3-0A66C2?style=for-the-badge\u0026logo=openai\u0026logoColor=white\" /\u003e\n\nQuickCapture Mobile Document Scanning, Imaging \u0026 Seccurity SDK Specially designed for native ANDROID from [Extrieve](https://www.extrieve.com/).\n\nNow powered by **KIMORA Ai V2**, our advanced AI model for intelligent document detection.\nTrained on a vast dataset of real-world documents, KIMORA delivers precise and reliable edge detection \u0026 auto document angle correction using a custom-designed AI architecture.\n\n\u003e It's not \"**just**\" a scanning SDK. It's a \"**document**\" \nscanning/capture SDK evolved with **Best Quality**, **Highest Possible Compression**, **Image Optimisation**, keeping output quality of the document in mind.\n\n\u003e Control **DPI**,**Layout** \u0026 **Size** of output images and can convert them into **PDF \u0026 TIFF**\n\n\u003e Automatically detect and correct the orientation/rotation of captured documents using the KIMORA AI v2 engine.\n\n\u003e **QR code** \u0026 **BAR Code** Scanning \u0026 Generation\n\n\u003e **Developer-friendly** \u0026 **Easy to integrate** SDK.\n\n\u003e **DeviceGuard** for Anti-Spoofing (Root, Emulator, Mock Location detection) and **DeviceInfo** for offline **DigiPin** generation and hardware intelligence.\n \n\u003e **Works entirely offline**, locally on the device, with **no data transferred to any server or third party**.  \n\n*For reduced build size if needed, an initial internet connection may optionally be required to fetch ML data or resource files, depending on the specific integration and features used by the consumer application*\n\n\u003e **End of support Notice** :\n\u003e QuickCapture SDK Android **V1** deprecated by Dec. 2022.For any further updates and support, can use **V2**\n\u003e which having no major modifications.But with improved funcionalities,feature additions and fixes.\n\u003e \n\u003e QuickCapture SDK Android **V2** deprecated by May. 2024.For any further updates and support, can use **V4** \u0026 bugfixes on **V3** \n\nAccess / Download\n--------\nYou can use this SDK in any Android project simply by using Gradle :\n\n```java\n//Add expack central repo in settings.gradle (Project Settings)\nrepositories {\n  google()\n  mavenCentral()\n  maven {url 'https://expack.extrieve.in/maven/'}\n}\n\n//Then add implementation for SDK in dependencies in build.gradle (module:\u003cyourmodulename\u003e)\ndependencies {\n  implementation 'com.extrieve.quickcapture:QCv4_PLUS:\u003cSDK-VERSION\u003e'\n}\n//SDK-VERSION - Need to replace with the correct v4 series.\n```\n\nOr Maven:\n\n```xml\n\u003cdependency\u003e\n  \u003cgroupId\u003ecom.extrieve.quickcapture\u003c/groupId\u003e\n  \u003cartifactId\u003eQCv4_PLUS\u003c/artifactId\u003e\n  \u003cversion\u003eSDK-VERSION\u003c/version\u003e\n\u003c/dependency\u003e\n//SDK-VERSION - Need to replace with the correct v4 series\n```\n\nOr can even integrate with the **.aar** library file and manually add the file dependency to the project/app.\n\n\nCompatibility\n-------------\n * **JAVA 17 Support**: QuickCapture v4 requires JAVA version 17 support for the application.\n * **Minimum Android SDK**: QuickCapture v4 requires a minimum API level of 21.\n * **Target Android SDK**: QuickCapture v4 features supports **API 36**.\n  * **Compiled SDK Version**: QuickCapture v4 compiled against **API 34**.Host application using this SDK should compiled against 34 or later\n  ## Run-time requirement\n\n- [x] This SDK is designed to run on officially supported Android \u0026 iOS devices only.\n- [x] On Android, Google Play Services is mandatory.\n- [x] Supported CPU architectures: arm64-v8a and armeabi-v7a.\n- [x] Simulator and emulator environments are not supported.For testing on simulators, please contact the development support team to request a dedicated test version compatible with those environments.\n\n# API \u0026  integration  Details \nAvailable properties and method\n\nSDK has four core classes and supporting classes :\n\n 1. **CameraHelper** - *Handles the  camera  related  operations. Basically, an activity.* \n 2. **ImgHelper** - *Purpose of this class is to handle all imaging related operations.*\n 3. **OpticalCodeHelper** -\t*Handles the  Optical code (QR CODE \u0026 BAR CODE) related activities*\n 4. **HumanFaceHelper** -\t*Advanced Ai based utility class handles all functionalities such as face detection, extraction,matching \u0026 related functions.*\n 5. **Config**\t\t  \t-\t*Holds various configurations for SDK including licensing*\n \n\nBased on the requirement, any one or all classes can be used.And need to import those from the SDK.\n```java\n    import com.extrieve.quickcapture.sdk.*;\n    //OR : can import only required classes as per use cases.\n    import  com.extrieve.quickcapture.sdk.ImgHelper;  \n    import  com.extrieve.quickcapture.sdk.CameraHelper;\n    import  com.extrieve.quickcapture.sdk.OpticalCodeHelper;\n    import  com.extrieve.quickcapture.sdk.Config;  \n    import com.extrieve.quickcapture.sdk.HumanFaceHelper;\n    import  com.extrieve.quickcapture.sdk.ImgException;\n   ```\n---\n## 1. CameraHelper - The document capture class\nThis core class will be implemented as an activity.This class can be initialized as intent.\n```java\n//JAVA\nCameraHelper CameraHelper = new CameraHelper();\n```\n```kotlin\n//Kotlin\nvar cameraHelper: CameraHelper? = CameraHelper()\n```\n\nWith an activity call, triggering the SDK for capture activity can be done.Most operations in **CameraHelper** is **activity based**.\n\nSDK is having multiple flows as follows :\n\t\n* **CAMERA_CAPTURE_REVIEW** - *Default flow. Capture with SDK Camera **-\u003e** review.*\n* **SYSTEM_CAMERA_CAPTURE_REVIEW** - *Capture with system default camera **-\u003e** review.*\n* **IMAGE_ATTACH_REVIEW** - *Attach/pass image **-\u003e** review.*\n  \n\n**1. CAMERA_CAPTURE_REVIEW** - *Default flow of the CameraHelper. Includes Capture with SDK Camera -\u003e Review Image.*\n\n```java\n//JAVA\n\n//Set CaptureMode as CAMERA_CAPTURE_REVIEW\nConfig.CaptureSupport.CaptureMode = Config.CaptureSupport.CaptureModes.CAMERA_CAPTURE_REVIEW;\n//set permission for output path that set in config.\nUriphotoURI = Uri.parse(Config.CaptureSupport.OutputPath);\nthis.grantUriPermission(this.getPackageName(),photoURI,Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);  \n\n//Create CameraIntent for CameraHelper activity call.\nIntent CameraIntent = new Intent(this,Class.forName(\"com.extrieve.quickcapture.sdk.CameraHelper\"));\nif  (Build.VERSION.SDK_INT \u003c= Build.VERSION_CODES.LOLLIPOP)  {\n\tCameraIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);\n}\n//Call the Activity.\nstartActivityForResult(CameraIntent,REQUEST_CODE_FILE_RETURN);\n\n//On activity result,recieve the captured, reviewed, cropped, optimised \u0026 compressed image collection as array.\n@Override\nprotected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data)  \n{\n\tsuper.onActivityResult(requestCode,  resultCode,  data);\n\tif  (requestCode == REQUEST_CODE_FILE_RETURN \u0026\u0026 resultCode == Activity.RESULT_OK)\n\t{  \n\t\tBoolean Status = (Boolean)data.getExtras().get(\"STATUS\");\n\t\tString Description = (String)data.getExtras().get(\"DESCRIPTION\");  \n\t\tif(Status == false){ \n\t\t\t//Failed  to  capture\n\t\t}\n\t\tfinishActivity(REQUEST_CODE_FILE_RETURN); return;\n\t}\n\tFileCollection = (ArrayList\u003cString\u003e)data.getExtras().get(\"fileCollection\");\n\t//FileCollection //: will contain all capture images path as string\n\tfinishActivity(REQUEST_CODE_FILE_RETURN);\n}\n```\n```kotlin\n//Kotlin\ntry {\n    /*DEV_HELP :redirecting to camera*/\n    val captureIntent = Intent(this, Class.forName(\"com.extrieve.quickcapture.sdk.CameraHelper\"))\n    val photoURI = Uri.parse(Config.CaptureSupport.OutputPath)\n    grantUriPermission(\n\tthis.packageName, photoURI,\n\tIntent.FLAG_GRANT_WRITE_URI_PERMISSION or Intent.FLAG_GRANT_READ_URI_PERMISSION\n    )\n    if (Build.VERSION.SDK_INT \u003c= Build.VERSION_CODES.LOLLIPOP) {\n\tcaptureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION)\n    }\n    captureActivityResultLauncher!!.launch(captureIntent)\n} catch (ex: Exception) {\n    /*DEV_HELP : TODO : handle invalid Exception*/\n    Toast.makeText(this, \"Failed to open camera  -\" + ex.message, Toast.LENGTH_LONG).show()\n}\n```\n\n**2. SYSTEM_CAMERA_CAPTURE_REVIEW** - *If user needs to capture an image with system default camera, this can be used. It includes Capture with system default camera -\u003e Review*.\n\n```java\n//JAVA\n\n//Set CaptureMode as SYSTEM_CAMERA_CAPTURE_REVIEW\nConfig.CaptureSupport.CaptureMode = Config.CaptureSupport.CaptureModes.SYSTEM_CAMERA_CAPTURE_REVIEW;\n//set permission for output path that is set in config.\nUriphotoURI = Uri.parse(Config.CaptureSupport.OutputPath);\nthis.grantUriPermission(this.getPackageName(),photoURI,Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);  \n\n//Create CameraIntent for CameraHelper activity call.\nIntent CameraIntent = new Intent(this,Class.forName(\"com.extrieve.quickcapture.sdk.CameraHelper\"));\nif  (Build.VERSION.SDK_INT \u003c= Build.VERSION_CODES.LOLLIPOP)  {\n\tCameraIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);\n}\n//Call the Activity.\nstartActivityForResult(CameraIntent,REQUEST_CODE_FILE_RETURN);\n\n//On activity result,recieve the captured, reviewed, cropped, optimised \u0026 compressed image colletion as array.\n@Override\nprotected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data)  \n{\n\tsuper.onActivityResult(requestCode,  resultCode,  data);\n\tif  (requestCode == REQUEST_CODE_FILE_RETURN \u0026\u0026 resultCode == Activity.RESULT_OK)\n\t{  \n\t\tBoolean Status = (Boolean)data.getExtras().get(\"STATUS\");\n\t\tString Description = (String)data.getExtras().get(\"DESCRIPTION\");  \n\t\tif(Status == false){ \n\t\t\t//Failed  to  capture\n\t\t}\n\t\tfinishActivity(REQUEST_CODE_FILE_RETURN); return;\n\t}\n\tFileCollection = (ArrayList\u003cString\u003e)data.getExtras().get(\"fileCollection\");\n\t//FileCollection //: will contain all capture images path as string\n\tfinishActivity(REQUEST_CODE_FILE_RETURN);\n}\n```\n```kotlin\n//Kotlin\ntry {\n    /*DEV_HELP :redirecting to camera*/\n    val captureIntent = Intent(this, Class.forName(\"com.extrieve.quickcapture.sdk.CameraHelper\"))\n    val photoURI = Uri.parse(Config.CaptureSupport.OutputPath)\n    grantUriPermission(\n\tthis.packageName, photoURI,\n\tIntent.FLAG_GRANT_WRITE_URI_PERMISSION or Intent.FLAG_GRANT_READ_URI_PERMISSION\n    )\n    if (Build.VERSION.SDK_INT \u003c= Build.VERSION_CODES.LOLLIPOP) {\n\tcaptureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION)\n    }\n    captureActivityResultLauncher!!.launch(captureIntent)\n} catch (ex: Exception) {\n    /*DEV_HELP : TODO : handle invalid Exception*/\n    Toast.makeText(this, \"Failed to open camera  -\" + ex.message, Toast.LENGTH_LONG).show()\n}\n```\n\n**3. IMAGE_ATTACH_REVIEW** - *This option can be used if the user needs to review an image from their device's gallery. After attaching each image, the review and all dependent functionalities become available*.\n\n```java\n//JAVA\n\n//Set CaptureMode as IMAGE_ATTACH_REVIEW\nConfig.CaptureSupport.CaptureMode = Config.CaptureSupport.CaptureModes.IMAGE_ATTACH_REVIEW;\n//Create/Convert/ get Image URI from image source.\nUri ImgUri = data.getData();\n//Create ReviewIntent for CameraHelper activity call.\nIntent ReviewIntent = new Intent(this,Class.forName(\"com.extrieve.quickcapture.sdk.CameraHelper\"));\n//Add the image URI to intent request with a key : ATTACHED_IMAGE.\nReviewIntent.putExtra(\"ATTACHED_IMAGE\", ImUri);\n//Call the Activity.\nstartActivityForResult(ReviewIntent,REQUEST_CODE_FILE_RETURN);\n\n//On activity result,recieve the captured, reviewed, cropped, optimised \u0026 compressed image colletion as array.\n@Override\nprotected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data)  \n{\n\tsuper.onActivityResult(requestCode,  resultCode,  data);\n\tif  (requestCode == REQUEST_CODE_FILE_RETURN \u0026\u0026 resultCode == Activity.RESULT_OK)\n\t{  \n\t\tBoolean Status = (Boolean)data.getExtras().get(\"STATUS\");\n\t\tString Description = (String)data.getExtras().get(\"DESCRIPTION\");  \n\t\tif(Status == false){ \n\t\t\t//Failed  to  capture\n\t\t}\n\t\tfinishActivity(REQUEST_CODE_FILE_RETURN); return;\n\t}\n\tFileCollection = (ArrayList\u003cString\u003e)data.getExtras().get(\"fileCollection\");\n\t//FileCollection //: will contains all capture images path as string\n\tfinishActivity(REQUEST_CODE_FILE_RETURN);\n}\n```\n```kotlin\n//Kotlin\n\ntry {\n    /*DEV_HELP :redirecting to camera*/\n    val captureIntent = Intent(this, Class.forName(\"com.extrieve.quickcapture.sdk.CameraHelper\"))\n    val photoURI = Uri.parse(Config.CaptureSupport.OutputPath)\n    grantUriPermission(\n\tthis.packageName, photoURI,\n\tIntent.FLAG_GRANT_WRITE_URI_PERMISSION or Intent.FLAG_GRANT_READ_URI_PERMISSION\n    )\n    if (Build.VERSION.SDK_INT \u003c= Build.VERSION_CODES.LOLLIPOP) {\n\tcaptureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION)\n    }\n    captureActivityResultLauncher!!.launch(captureIntent)\n} catch (ex: Exception) {\n    /*DEV_HELP : TODO : handle invalid Exception*/\n    Toast.makeText(this, \"Failed to open camera  -\" + ex.message, Toast.LENGTH_LONG).show()\n}\n```\n## 2. Config\nThe SDK includes a supporting class called for static configuration. This class holds all configurations related to the SDK. It also contains sub-configuration collection for further organization. This includes:  :\n\n**CaptureSupport** - Contains all the Capture \u0026 review related configurations. **Config.CaptureSupport**   contains various configurations as follows:\n\n- **BottomStampData** -  This configuration will automatically print the specified text at the bottom of the captured image with correct alignment, font size and DPI**. This also  supports placeholders, such as  `{DATETIME}`, which will be replaced with the current date and time from the device at the time of stamping.  **$** - for  new line print.\n\t```java\n\t //JAVA\n\tConfig.CaptureSupport.BottomStampData =\"{DATETIME} , Other info $ next line info.\";\n\t```\n\t```kotlin\n\t //Kotlin\n\tConfig!!.CaptureSupport!!.BottomStampData = =\"{DATETIME} , Other info $ next line info.\";\n\t```\n\n- **OutputPath** - To set the output directory in which the captured images will be saved, base app should have rights to write to the provided path.\n\t```java\n \t//JAVA\n\tConfig.CaptureSupport.OutputPath = \"pass output path sd string\";\n\t```\n\t```kotlin\n \t//Kotlin\n\tConfig!!.CaptureSupport!!.OutputPath = \"pass output path sd string\";\n\t```\n- **MaxPage** - To set the number of captures to do on each camera session, can also control whether the capture mode is single  or multi i.e :\n\t\u003e if  MaxPage  \u003c= 0 /  not  set:  means  unlimited.If  MaxPage  \u003e= 1:\n\t\u003e means  limited.\n\t```java\n\t//JAVA\n\t// MaxPage \u003c= 0  : Unlimited Capture Mode  \n\t// MaxPage = 1   : Limited Single Capture  \n\t// MaxPage \u003e 1   : Limited Multi Capture Mode  \n\tConfig.CaptureSupport.MaxPage = 0;\n\t```\n\t```java\n\t//Kotlin\n\t// MaxPage \u003c= 0  : Unlimited Capture Mode  \n\t// MaxPage = 1   : Limited Single Capture  \n\t// MaxPage \u003e 1   : Limited Multi Capture Mode  \n\tConfig!!.CaptureSupport!!.MaxPage = 0;\n\t```\n- **ColorMode**  -  To Set the capture color mode - supporting color and grayscale.\n\t```java\n\t//JAVA\n\tConfig.CaptureSupport.ColorMode = Config.CaptureSupport.ColorModes.RBG;\n\t//RBG (1) - Use capture flow in color mode.\n\t//GREY (2) - Use capture flow in grey scale mode.\n\t```\n\t```kotlin\n\t//Kotlin\n\tConfig!!.CaptureSupport!!.ColorMode = Config!!.CaptureSupport!!.ColorModes!!.RBG;\n\t//RBG (1) - Use capture flow in color mode.\n\t//GREY (2) - Use capture flow in grey scale mode.\n\t```\n- **EnableFlash**  -  Enable Document capture specific flash control for SDK camera.\n\t```java\n\t//JAVA\n\tConfig.CaptureSupport.EnableFlash = true;\n\t```\n\t```kotlin\n\t//Kotlin\n\tConfig!!.CaptureSupport!!.EnableFlash = true;\n\t```\n- **CaptureSound**  -  To Enable camera capture sound.\n\t```java\n\t//JAVA\n\tConfig.CaptureSupport.CaptureSound = true;\n\t```\n\t```kotlin\n\t//Kotlin\n\tConfig!!.CaptureSupport!!.CaptureSound = true;\n\t```\n- **CaptureReview**  -  To Enables or disables review after capture.\n\t```java\n\t//JAVA\n\tConfig.CaptureSupport.CaptureReview = true; //By default it is enabled\n\t```\n\t```kotlin\n\t//Kotlin\n\tConfig!!.CaptureSupport!!.CaptureReview = true; //By default it is enabled\n\t```\n\n- **ShowCaptureCountAndLimit**  -  Displays the count and limit of captures.\n\t```java\n\t//JAVA\n\tConfig.CaptureSupport.ShowCaptureCountAndLimit = true; //By default it is enabled\n\t```\n\t```kotlin\n\t//Kotlin\n\tConfig!!.CaptureSupport!!.ShowCaptureCountAndLimit = true; //By default it is enabled\n\t```\n\n- **CameraToggle**  -  Toggle  camera  between  front  and  back.\n\t```java\n\t//JAVA\n\tConfig.CaptureSupport.CameraToggle = CameraToggleType.ENABLE_BACK_DEFAULT;\n\t//DISABLED (0) -Disable camera toggle option.\n\t//ENABLE_BACK_DEFAULT (1) - Enable camera toggle option with Front camera by default.\n\t//ENABLE_FRONT_DEFAULT (2) - Enable camera toggle option with Back camera  by default.\n\t```\n\t```kotlin\n\t//Kotlin\n\tConfig!!.CaptureSupport!!.CameraToggle = CameraToggleType!!.ENABLE_BACK_DEFAULT;\n\t//DISABLED (0) -Disable camera toggle option.\n\t//ENABLE_BACK_DEFAULT (1) - Enable camera toggle option with Front camera by default.\n\t//ENABLE_FRONT_DEFAULT (2) - Enable camera toggle option with Back camera  by default.\n\t```\n\n- **EnableTorchOnLowLight**  -  Enables or Disable automatic torch turning on when low light detected.\n\t```java\n\t//JAVA\n\tConfig.CaptureSupport.EnableTorchOnLowLight = false; // By Default it is disabled.\n\t```\n\t```kotlin\n\t//Kotlin\n\n\tConfig!!.CaptureSupport!!.EnableTorchOnLowLight = false; // By Default it is disabled.\n\t```\n\n- **PerspectiveCorrection**  -  Applies perspective correction if enabled after crop.\n\t```java\n\t//JAVA\n\tConfig.CaptureSupport.PerspectiveCorrection = true; // By Default it is enabled.\n\t```\n\t```kotlin\n\t//Kotlin\n\n\tConfig!!.CaptureSupport!!.PerspectiveCorrection = true; // By Default it is enabled.\n\t```\n\n- **DocumentCropping**  -  Specifies the cropping behavior after capturing an image.\n\t```java\n\t//JAVA\n\t//CroppingType options are as follows:\n\t//AutoCapture - Automatically crops the captured image.\n\t//AssistedCapture - Provides assistance to the user for cropping.\n\t//AutoCrop - Automatically detects and crops the content.\n\t//Disabled - No cropping is performed.\n\tConfig.CaptureSupport.DocumentCropping = Config.CaptureSupport.CroppingType.AssistedCapture; // Default value.\n\t```\n\t```kotlin\n\t//Kotlin\n\t//CroppingType options are as follows:\n\t//AutoCapture - Automatically crops the captured image.\n\t//AssistedCapture - Provides assistance to the user for cropping.\n\t//AutoCrop - Automatically detects and crops the content.\n\t//Disabled - No cropping is performed.\n\tConfig!!.CaptureSupport!!.DocumentCropping = Config.CaptureSupport.CroppingType.AssistedCapture; // Default value.\n\t```\n\n- **CropFilter**  -  Specifies the type of image filter to apply after cropping.\n\t```java\n\t//JAVA\n\t//CropImageFilterType options are as follows:\n\t//NONE - No image enhancement.\n\t//ENHANCE - Enhances the image quality.\n    //GRAY - Converts the image to grayscale.\n    //XEROX - Applies a Xerox photocopy style effect.\n\tConfig.CaptureSupport.CropFilter = Config.CaptureSupport.CropImageFilterType.NONE; //Default value\n\t```\n\t```kotlin\n\t//Kotlin\n\t//CropImageFilterType options are as follows:\n\t//NONE - No image enhancement.\n\t//ENHANCE - Enhances the image quality.\n    //GRAY - Converts the image to grayscale.\n    //XEROX - Applies a Xerox photocopy style effect.\n\tConfig!!.CaptureSupport!!.CropFilter = Config.CaptureSupport.CropImageFilterType.NONE; // Default value.\n\t```\n\n\n**Review** - Contains all the Review related configurations. **Config.CaptureSupport.Review**   contains various configurations as follows:\n- ***EnableAutoCorrectDocAngle*** - *Toggle the auto rotation feature when image is attached to the review screen.*\n\t```java\n \t//JAVA\n\tConfig.CaptureSupport.Review.EnableAutoCorrectDocAngle = false; //to disable this feature\n\t```\n \t```kotlin\n  \t//Kotlin\n\tConfig!!.CaptureSupport!!.Review!!.EnableAutoCorrectDocAngle = false;\n\t```\n\t \u003e **Note** : For any scenario (Normal photo capture) if auto rotation is not needed then host application should disbale it using this config.\n\t \n\n**Common** - Contains various configurations as follows:\n\n- **SDKInfo**  - Contains all version related information on SDK.\n\t```java\n\t//JAVA\n\tConfig.Common.SDKInfo;\n\t```\n\t```kotlin\n\t//Kotlin\n\tConfig!!.Common!!.SDKInfo;\n\t```\n- **DeviceInfo** - Will share all general information about the device.\n\t```java\n\t//JAVA\n\tConfig.Common.DeviceInfo;\n\t```\n\t```kotlin\n\t//Kotlin\n\tConfig!!.Common!!.DeviceInfo;\n\t```\n**License** - Cotrolls all activities relates to licensing.\n- ***Activate*** - *Method to activate the SDK license.*\n\t```java\n \t//JAVA\n\tConfig.License.Activate(hostApplicationContext,licenseString);\n\t```\n \t```kotlin\n  \t//Kotlin\n\tConfig!!.License!!.Activate(hostApplicationContext,licenseString)\n\t```\n\t \u003e **hostApplicationContext** : Application context of host/client application which is using the SDK.\n\t \t \u003e **licenseString** : Licence data in string format.\n\t \n\t \n\n## 3. ImgHelper - The imaging class\nFollowing are the options/methods available from class **ImgHelper** :\n```java\n//JAVA\nImgHelper ImageHelper = new ImgHelper(this);\n```\n```kotlin\n//Kotlin\nvar ImageHelper: ImgHelper? = ImgHelper(this)\n```\n- ***SetImageQuality*** - *Set the Quality of the image, Document_Quality is used. If documents are used further for any automations and OCR, use Document_Quality.*\n\t \u003e*Available Image Qualities* :\n\t\t1. Photo_Quality.\n\t\t2. Document_Quality.\n\t\t3. Compressed_Document.\n\t\t\n\t```java\n\t//JAVA\n\tImageHelper.SetImageQuality(ImgHelper.ImageQuality.Photo_Quality.ordinal());\n\t//--------------------------\n\tImageHelper.SetImageQuality(1);//0,1,2 - Photo_Quality, Document_Quality, Compressed_Document\n\t```\n \t```kotlin\n  \t//Kotlin\n\timageHelper!!.SetImageQuality(1)\n\t```\n- ***SetPageLayout*** - *Set the Layout for the images generated/processed by the system.*\n\t```java\n\t//JAVA\n\tImageHelper.SetPageLayout(ImgHelper.LayoutType.A4.ordinal());\n\t//--------------------------\n\tImageHelper.SetPageLayout(4);//A1-A7(1-7),PHOTO,CUSTOM,ID(8,9,10)\n\t```\n\t```kotlin\n\t//Kotlin\n\timageHelper!!.SetPageLayout(4)\n\t```\n\t \u003e*Available layouts* : A1, A2, A3, **A4**, A5, A6, A7,PHOTO \u0026 CUSTOM\n\t \n\t*A4 is the most recommended layout for document capture scenarios.*\n\t \n- ***SetDPI*** - *Set DPI(depth per inch) for the image.*\n\t```java\n\t//JAVA\n\tImageHelper.SetDPI(ImgHelper.DPI.DPI_200.ordinal());\n\t//--------------------------\n\tImageHelper.SetDPI(200);//int dpi_val = 150, 200, 300, 500, 600;\n\t```\n\t```kotlin\n\t//Kotlin\n\timageHelper!!.SetDPI(200)\n\t```\n\t \u003e*Available DPI* : DPI_150, DPI_200, DPI_300, DPI_500, DPI_600\n\t \n\t *150 \u0026 200 DPI is most used.And 200 DPI recommended for OCR and other image extraction prior to capture.*\n\t \n- ***GetThumbnail*** - *This method Will build thumbnail for the given image in custom width,height \u0026 AspectRatio.*\n\t```java\n\t//JAVA\n\tBitmap thumb = ImageHelper.GetThumbnail(ImageBitmap, 600, 600, true);\n\t/*\n\tBitmap GetThumbnail(\n\t\t@NonNull  Bitmap bm,\n\t    int reqHeight,\n\t    int reqWidth,\n\t    Boolean AspectRatio )throws ImgException.\n\t*/\n\t```\n\t```kotlin\n\t//KOTLIN\n\tvar thumb = ImageHelper!!.GetThumbnail(ImageBitmap, 600, 600, true);\n\t```\n- ***CompressToJPEG*** - *This method will Compress the provided bitmap image and will save to given path.*\n\t```java\n\t//JAVA\n\tBoolean Iscompressed = ImageHelper.CompressToJPEG(bitmap,outputFilePath);\n\t/*\n\tBoolean CompressToJPEG(Bitmap bm,String outputFilePath)\n\t\tthrows ImgException\n\t*/\n\t```\n\t```kotlin\n\t//KOTLIN\n\tvar Iscompressed = ImageHelper!!.CompressToJPEG(bitmap, outputFilePath);\n\t```\n- **GetTiffForLastCapture** - Build Tiff output file from last captured set of images.\n\t```java\n\t//JAVA\n\tImageHelper.GetTiffForLastCapture(outPutFileWithpath);\n\t//on success, will respond with string : \"SUCCESS:::TiffFilePath\";\n\t//use  \":::\"  char.  key  to  split  the  response.\n\t//on failure,will respond with string : \"FAILED:::Reason for failure\";\n\t//use \":::\" char. key to split the response.\n\t//on failure, error details can collect from CameraSupport.CamConfigClass.LastLogInfo\n\t```\n\t```kotlin\n\t//KOTLIN\n\tvar thumb = ImageHelper!!.GetTiffForLastCapture(outPutFileWithpath);\n\t```\n- **GetPDFForLastCapture**  -  Build  PDF  output file  from  last  captured  set  of  images.\n\t```java\n\t//JAVA\n\tImageHelper.GetPDFForLastCapture(outPutFileWithpath);\n\t//on success, will respond with string : \"SUCCESS:::PdfFilePath\";\n\t//use  \":::\"  char.  key  to  split  the  response.\n\t//on failure,will respond with string : \"FAILED:::Reason for failure\";\n\t//use \":::\" char. key to split the response.\n\t//on failure, error details can collect from CameraSupport.CamConfigClass.LastLogInfo\n\t```\n \t```kotlin\n\t//KOTLIN\n\tvar thumb = ImageHelper!!.GetPDFForLastCapture(outPutFileWithpath);\n\t```\n- **BuildTiff**  - Build tiff output file from the list  of  images shared.\n\t```java\n\t//JAVA\n\tImageHelper.BuildTiff(ImageCol,OutputTiffFilePath);\n\t*@param \"Image File path collection as ArrayList\u003cString\u003e\".\n\t*@param \"Output Tiff FilePath as String\".\n\t*@return on failure = \"FAILED:::REASON\" || on success = \"SUCCESS:::TIFF file path\".\n\t```\n\t```kotlin\n\t//KOTLIN\n\tvar thumb = ImageHelper!!.BuildTiff(ImageCol,OutputTiffFilePath);\n\t```\n- **BuildPDF**  - Build PDF output file from last captured set of images.\n\t```java\n\t//JAVA\n\tImageHelper.BuildPDF(ImageCol,outPutPDFFileWithpath);\n\t*@param  \"Image File path collection as ArrayList\u003cString\u003e\"\n\t*@param \"Output Tiff FilePath as String\".\n\t*@return  on failure = \"FAILED:::REASON\" || on success = \"SUCCESS:::PDF file path\".\n\t```\n\t```kotlin\n\t//KOTLIN\n\tvar thumb = ImageHelper!!.BuildPDF(ImageCol,OutputTiffFilePath);\n\t```\n\u003e  **Recommended Settings:**\n\u003e  - ImageQuality: `documentQuality`\n\u003e  - DPI: `150` or `200`\n\u003e  - LayoutType: `A4`\n\u003e  - ResizeMode: `preserveAspectOnly`\n\n\n\n## 4. DeviceInfo - The device info class.\n\nThe `DeviceInfo` class provides detailed system specifications, real-time battery status, and precise location intelligence. It features a built-in **Offline Engine** for generating **DigiPins** (India Post's digital addressing system) from coordinates, eliminating the need for external APIs.\n\n### Initialization\n\n```java\n// JAVA\nDeviceInfo deviceInfo = DeviceInfo.getInstance(this);\n\n```\n\n```kotlin\n// KOTLIN\nval deviceInfo = DeviceInfo.getInstance(this)\n\n```\n\n### A. Hardware \u0026 System Specs\n\nRetrieve a comprehensive map of device details (RAM, Battery, CPU, OS). This is a **Synchronous** (instant) call.\n\n```java\nMap\u003cString, Object\u003e specs = deviceInfo.getSpecs().getDetails();\n\n```\n\n#### 📋 Response Data (Specs Map)\n\n| Key | Data Type | Description | Example |\n| --- | --- | --- | --- |\n| **`manufacturer`** | `String` | Device Manufacturer | `\"Google\"` |\n| **`model`** | `String` | Device Model Name | `\"Pixel 7\"` |\n| **`os_release`** | `String` | Android OS Version | `\"14\"` |\n| **`sdk_int`** | `int` | Android API Level | `34` |\n| **`cpu_hardware`** | `String` | Processor Chipset Name | `\"qcom\"` |\n| **`ram_total_mb`** | `long` | Total RAM in MB | `7600` |\n| **`storage_free_gb`** | `long` | Free Internal Storage in GB | `128` |\n| **`battery_pct`** | `int` | Battery Level (0-100) | `85` |\n| **`battery_is_charging`** | `boolean` | Charging Status | `true` |\n| **`screen_density_dpi`** | `int` | Screen Density (DPI) | `480` |\n\n---\n\n### B. Location \u0026 DigiPin (Asynchronous)\n\nFetches GPS coordinates and automatically generates the **DigiPin** and **Postal Code**.\n\n\u003e **Prerequisite:** Parent app must handle `ACCESS_FINE_LOCATION` \u0026 `ACCESS_COARSE_LOCATION` permissions.\n\n```java\n// JAVA\nif (deviceInfo.hasLocationPermissions()) {\n    deviceInfo.getCurrentLocation(new DeviceInfo.LocationCallback() {\n        @Override\n        public void onSuccess(Map\u003cString, Object\u003e data) {\n            String digiPin = (String) data.get(\"digi_pin\");\n            String postalCode = (String) data.get(\"postal_code\");\n            Log.d(\"Extrieve\", \"DigiPin: \" + digiPin);\n        }\n\n        @Override\n        public void onError(String error) {\n            Log.e(\"Extrieve\", \"Location Error: \" + error);\n        }\n    });\n}\n\n```\n\n#### 📋 Response Data (Location Map)\n\n| Key | Data Type | Description | Example |\n| --- | --- | --- | --- |\n| **`latitude`** | `double` | GPS Latitude | `12.9716` |\n| **`longitude`** | `double` | GPS Longitude | `77.5946` |\n| **`accuracy`** | `float` | Accuracy radius (meters) | `12.5` |\n| **`digi_pin`** | `String` | **India Post Digital Address** | `\"85-12-3456\"` |\n| **`postal_code`** | `String` | Standard PIN Code (Network) | `\"560001\"` |\n| **`time`** | `long` | Timestamp of fix | `1705648293000` |\n\n---\n\n### C. DigiPin Utilities\n\nHelper methods to handle DigiPins without full location requests.\n\n| Method | Type | Description |\n| --- | --- | --- |\n| `generateDigiPin(lat, lon)` | **Synchronous** | Instantly converts coordinates to a DigiPin string. |\n| `getCurrentDigiPin(callback)` | **Asynchronous** | Fetches location internally and returns just the DigiPin string. |\n\n```java\n// Example: Convert known coordinates instantly\nString myPin = DeviceInfo.generateDigiPin(12.9716, 77.5946);\n// Output: \"85-12-3456\"\n\n```\n\n---\n\n## 5. DeviceGuard - Device security class\n\n**DeviceGuard** is a security engine designed for Banking, Insurance, and Enterprise apps. It prevents fraud by detecting environment tampering (Rooting, Emulators, GPS Spoofing) before a document is captured.\n\n### Initialization\n\n```java\n// JAVA\nDeviceGuard guard = DeviceGuard.getInstance(this);\n\n```\n\n```kotlin\n// KOTLIN\nval guard = DeviceGuard.getInstance(this)\n\n```\n\n### A. Security Report (Pre-Check)\n\nRun this check **before** launching the camera to ensure the device is trusted.\n\n```java\nMap\u003cString, Object\u003e report = guard.getSecurityReport();\nif ((boolean) report.get(\"isRooted\")) {\n    // Block User\n}\n\nif ((boolean) report.get(\"isLocationSpoofed\")) {\n    // Reject the capture - User is faking location\n}\n\n```\n\n#### 📋 Response Data (Security Map)\n\n| Key | Data Type | Description | Severity |\n| --- | --- | --- | --- |\n| **`isRooted`** | `boolean` | `true` if device is Rooted (Su/Magisk). | 🔴 Critical |\n| **`isLocationSpoofed`**| `boolean` | `true` if device is using Mock/Fake GPS location. |  🔴 Critical|\n| **`locationMessage`**| `String`| Diagnostic message for the location spoofing check.| 🔴 Critical|\n| **`isEmulator`** | `boolean` | `true` if running on a Simulator. | 🔴 Critical |\n| **`isDevOptionsEnabled`** | `boolean` | `true` if Developer Options are ON. | 🟠 High |\n| **`isAdbEnabled`** | `boolean` | `true` if USB Debugging is ON. | 🟠 High |\n| **`isVpnActive`** | `boolean` | `true` if VPN is masking the IP. | 🟡 Medium |\n\n### B. Screen Protection (Privacy)\n\nPrevents the QuickCapture screen from being recorded or captured via screenshots. Video recordings will result in a **black screen**.\n\n```java\n// Enable screen protection (call in onCreate() of your Activity)\nguard.enableScreenProtection(this);\n\n```\nTo turn off screen protection when it’s no longer needed:\n```java\n// Disable screen protection\nguard.disableScreenProtection(this);\n\n```\n\n### C. Real-Time Monitoring\n\nListen for threats while the app is running (e.g., user toggles VPN or Developer settings during a session).\n\n```java\nguard.startMonitoring((threatType, message) -\u003e {\n    Log.w(\"Security\", \"Threat: \" + threatType);\n});\n\n// Stop monitoring when done\nguard.stopMonitoring();\n\n```\n\n#### 📋 Threat Events\n\n| Threat Type | Trigger Condition |\n| --- | --- |\n| **`VPN_ACTIVATED`** | User connected to a VPN. |\n| **`DEV_OPTIONS_ENABLED`** | User enabled Developer Options in settings. |\n| **`SCREEN_RECORDING`** | (Android 15+) User started recording the screen. |\n\n\n## 6. HumanFaceHelper\n\nQuickCapture SDK equipped with advanced face identification intelligence can accurately detect human faces within documents and match them precisely.**SDK needs to be activated using a proper license** with Config.License.Acivate(); for the plus features to initialise.\n\n```java\n//JAVA\nHumanFaceHelper humanFaceObj = new HumanFaceHelper(this);\n```\n\n```kotlin\n//Kotlin\nvar humanFaceObj:HumanFaceHelper? = HumanFaceHelper(this)\n```\n\nFollowing are the options/methods available from the class **HumanFaceHelper** :\n\n-   **DetectHumanFaces** \\- DetectHumanFaces Method from \\*\\*humanFaceObj \\*\\* will Identify human faces from provided image and return the detected details. .\n    \n\t```java\n\t//DetectHumanFaces will use callback function to return the result.\n\thumanFaceObj.DetectHumanFaces(inputImage,detectHumanFacesCallBack);\n\t*@param : inputImage \"input image in Bitmap\".\n\t*@param : \"A callback method to capture the detected human faces response\".\n\t   \n\tfunction detectHumanFacesCallBack(resultJson) {\n\t\t//Process the resultJson\n\t}\n\n\t//Or use lambda function\n\thumanFaceObj.DetectHumanFaces(inputImage,resultJson -\u003e {\n\t\t//Detected response JSON\n\t});\n\t```\n\t    \n\tFollowing is a sample of response structure :\n\t    \n\t```java\n    {\n\t\t STATUS: true/false,\n\t\t //Detection status\n\t\t DESCRIPTION : \"SUCCESS\",\n\t\t //Success or failure description\n\t\t DOC_ID : 0,\n\t\t //Identifier/index of the used document.\n\t\t FACE_DATA :[\n\t\t //Collection of identified face data\n\t\t\t {\n\t\t\t\t ID : 0,\n\t\t\t\t //Identifier/index of face.\n\t\t\t\t LEFT : 0,\n\t\t\t\t TOP : 0,\n\t\t\t\t RIGHT : 0,\n\t\t\t\t BOTTOM : 0\n\t\t\t\t //Each location of face in document\n\t\t\t} \n\t\t ]\n\t}\n\t```\n    \n-   **MatchHumanFaces** \\- DetectHumanFaces Method from **humanFaceObj** \\- With AI intelligence, analyses the provided face data and returns a response on whether the provided faces are of same human or not.Document Id and Face Id will be provided by DetectHumanFaces, and same can be used.\n    \n\t```java\n\t//MatchHumanFaces will use callback function to return the result.\n\thumanFaceObj.MatchHumanFaces(DocId1,FaceId1,DocId2,FaceId2,matchHumanFacesCallBack);\n\t*@param  \"ID of first document\"\n\t*@param  \"Face ID of first document\"\n\t*@param  \"ID of second document\"\n\t*@param  \"Face ID of second document\".\n\t*@param : \"A callback method to capture the match human faces response\".\n\t   \n\tfunction matchHumanFacesCallBack(resultJson) \t{\n\t\t//Process the resultJson\n\t}\n\n\t//Or use lambda function\n\thumanFaceObj.MatchHumanFaces(DocId1,FaceId1,DocId2,FaceId2,,resultJson -\u003e {\n\t\t//Detected response JSON\n\t});\n\t```\n\t    \n\tFollowing is a sample response structure :\n\t    \n\t```java\n\t{\n\t\t STATUS: true/false,\n\t\t //Match status\n\t\t DESCRIPTION : \"SUCCESS\",\n\t\t //Success or failure description\n\t\t ACCURACY: 0,\n\t\t //Accuracy of match\n\t}\n\t```\n### Face Match Accuracy Interpretation\nThe match level is determined based on the accuracy percentage, which reflects the similarity between two facial images. The table below provides detailed descriptions for each match level.\n| **Match Percentage**  |  **Match Level**  |  **Description** |\n|--|--|--|\n| **90% - 100%** | ✅ **Highly Reliable Match** | Faces match with extremely high confidence. They are almost certainly the same person. Suitable for critical identification applications. |\n| **75% - 89%** | ✅ **Strong Match** | Faces matched successfully with a high probability of being the same person. Reliable for most identity verification use cases. |\n| **65% - 74%** | ⚠️ **Moderate Match** | Faces show good similarity, but further validation may be required. Manual verification is recommended before confirmation. |\n| **50% - 64%** | ⚠️ **Low Confidence Match** | Faces have some resemblance, but the similarity is not strong enough to confirm identity. Additional verification is needed. |\n| **0% - 49%** | ❌ **No Match** | Faces do not match. There is minimal similarity, and they are highly unlikely to be the same person. |\n\n### Usage of Results\n\n#### ✅ **Highly Reliable Match (90% - 100%)**\n-  **Best for**: Secure identity verification, biometric authentication, and critical decision-making.\n-  **Action**: **Automatic acceptance. No further review required.**\n\n#### ✅ **Strong Match (75% - 89%)**\n-  **Best for**: General identification scenarios where strong confidence is required.\n-  **Action**: **Safe for automatic approval** in most applications.\n\n#### ⚠️ **Moderate Match (65% - 74%)**\n-  **Best for**: Cases where additional review is acceptable before finalizing the decision.\n-  **Action**: **Manual verification recommended before confirming a match.**\n\n#### ⚠️ **Low Confidence Match (50% - 64%)**\n-  **Best for**: Situations requiring strict validation before acceptance.\n-  **Action**: **Use alternative verification methods. Do not rely on this score alone.**\n\n#### ❌ **No Match (0% - 49%)**\n-  **Best for**: Definitive rejection of mismatches.\n-  **Action**: **Automatically reject matches in this range.**\n\n## 7. OpticalCodeHelper - Class for QR Code and BAR code \n\nFollowing are the options/methods available from class **OpticalCodeHelper** :\n```java\n//JAVA\nOpticalCodeHelper opticalCodeObj = new OpticalCodeHelper(this);\n```\n```kotlin\n//Kotlin\nvar opticalCodeObj : OpticalCodeHelper? = OpticalCodeHelper(this)\n```\n- ***GenerateQRCode*** - *Method to generate QR Code*.Data need to pass in string format.Will return a bitmap of generated QR Code.\n\t\t\n\t```java\n\t//JAVA\n\tBitmap qrcode = opticalCodeObj.GenerateQRCode(QRdata);\n\t```\n\t```kotlin\n\t//KOTLIN\n\tvar qrcode = opticalCodeObj!!.GenerateQRCode(QRdata);\n\t```\n- ***GenerateBarcode*** - *Method to generate BAR Code*.Data need to pass in string format.Will return a bitmap of generated BAR Code.\n\t\t\n\t```java\n\t//JAVA\n\tBitmap qrcode = opticalCodeObj.GenerateBarcode(QRdata);\n\t```\n\t```kotlin\n\t//KOTLIN\n\tvar qrcode = opticalCodeObj!!.GenerateBarcode(QRdata);\n\t```\n- ***GenerateBarcodeWithText*** - *Method to generate GenerateBarcodeWithText*.Data need to pass in string format.Will return a bitmap of generated BAR Code with visible text.\n\t\t\n\t```java\n\t//JAVA\n\tBitmap qrcode = opticalCodeObj.GenerateBarcode(QRdata);\n\t```\n\t```kotlin\n\t//KOTLIN\n\tvar qrcode = opticalCodeObj!!.GenerateBarcode(QRdata);\n\t```\n- **Scan / Capture OpticalCodes (QR Code / BAR Code)** - *Option to Scan or capture the **Optical Codes**.This is an activity based call.On activity result, will get the extracted data from the optical code*\n\n\t```java\n\t//JAVA\n\t//Register the activity results\n\tprivate OpticalCodeActivityResultLauncher\u003cIntent\u003e registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -\u003e handleOpticalCaptureActivityResult(result));\n\t\n\t//trigger the activity\n\ttry {  \n\t\tIntent CameraIntent = new Intent(this, Class.forName(\"com.extrieve.quickcapture.sdk.OpticalCodeHelper\"));  \n\t\tUri photoURI = Uri.parse(Config.CaptureSupport.OutputPath);  \n\t\tthis.grantUriPermission(this.getPackageName(), photoURI, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);  \n\t\tif (Build.VERSION.SDK_INT \u003c= Build.VERSION_CODES.LOLLIPOP) {  \n\t\t\tCameraIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);  \n\t\t}  \n\t\tcaptureActivityResultLauncher.launch(CameraIntent);  \n\t} catch (ClassNotFoundException e) {  \n\t\tToast.makeText(this, \"Failed to open camera + \", Toast.LENGTH_LONG).show();  \n\t\te.printStackTrace();  \n\t}\n\t\n\t//Registered method to handle the result on callback\n\tprivate void handleOpticalCaptureActivityResult(ActivityResult result) {  \n\t{  \n\t\tint resultCode = result.getResultCode();  \n\t\tif (resultCode == Activity.RESULT_OK) {\n\t\t\tString qrData = (String) data.getExtras().get(\"DATA\");  \n\t\t\tString qrType = (String) data.getExtras().get(\"TYPE\");  \n\t\t\t//showToast(\"QR_BAR_Code Data: \" + qrData, Gravity.CENTER);  \n\t\t\t//Here captured optical codes data can be extracted\n\t\t\tfinishActivity(REQUEST_CODE_FILE_RETURN);  \n\t\t\treturn;\n\t\t}\n\t}\n\t```\n\t```kotlin\n\t//Kotlin\n\t\n\t// Register the activity results\n\tprivate val opticalCaptureActivityResultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -\u003e\n\t   handleOpticalCaptureActivityResult(result)\n\t}\n\n\t// Trigger the activity\n\ttry {\n\t   val cameraIntent = Intent(this, Class.forName(\"com.extrieve.quickcapture.sdk.OpticalCodeHelper\"))\n\t   val photoURI: Uri = Uri.parse(Config.CaptureSupport.OutputPath)\n\t   this.grantUriPermission(this.packageName, photoURI, Intent.FLAG_GRANT_WRITE_URI_PERMISSION or Intent.FLAG_GRANT_READ_URI_PERMISSION)\n\t   if (Build.VERSION.SDK_INT \u003c= Build.VERSION_CODES.LOLLIPOP) {\n\t       cameraIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION)\n\t   }\n\t   opticalCaptureActivityResultLauncher.launch(cameraIntent)\n\t} catch (e: ClassNotFoundException) {\n\t   Toast.makeText(this, \"Failed to open camera + \", Toast.LENGTH_LONG).show()\n\t   e.printStackTrace()\n\t}\n\n\t// Registered method to handle the result on callback\n\tprivate fun handleOpticalCaptureActivityResult(result: ActivityResult) {\n\t   val resultCode = result.resultCode\n\t   val data = result.data\n\t   if (resultCode == Activity.RESULT_OK \u0026\u0026 data != null) {\n\t       val qrData = data.extras?.getString(\"DATA\")\n\t       val qrType = data.extras?.getString(\"TYPE\")\n\t       // showToast(\"QR_BAR_Code Data: $qrData\", Gravity.CENTER)\n\t       // Here captured optical codes data can be extracted\n\t       finishActivity(REQUEST_CODE_FILE_RETURN)\n\t   }\n\t}\n\t```\n# Error Handling \u0026 Exceptions \n- As a part of exceptional error handling **ImgException** class is available.\n\t- *Following are the possible errors and corresponding codes*:\n\t\t- CREATE_FILE_ERROR= **-100**;\n\t\t- IMAGE_ROTATION_ERROR= **-101**;\n\t\t- LOAD_TO_BUFFER_ERROR= **-102**;\n\t\t- DELETE_FILE_ERROR= **-103**;\n\t\t- GET_ROTATION_ERROR= **-104**;\n\t\t- ROTATE_BITMAP_ERROR= **-105**;\n\t\t- BITMAP_RESIZE_ERROR= **-106**;\n\t\t- CAMERA_HELPER_ERROR= **-107**;\n\t\t- LOG_CREATION_ERROR= **-108**;\n- Also with **Config.CaptureSupport.LastLogInfo** last logged exception or error details can be identified.\n\n# Notes\n### Regarding accuracy :\n\nThe accuracy of face detection and matching technologies depends on input image quality, including factors such as image distortion, rotation angles, lighting conditions, and color consistency. While offline solutions effectively reduce manual effort and operational costs, they do not guarantee 100% reliability in all scenarios.\n\nThis system enables on-device verification, efficiently identifying doubtful matches and flagging them for backend verification within the offline environment. By integrating backend validation, the system enhances reliability without relying on external APIs. Additionally, when a match achieves high accuracy as defined in the accuracy thresholds, the system can be considered reliable even without backend verification, making it a valuable solution for offline scenarios where external validation is limited.\n\nFor use cases demanding exceptionally high accuracy and reliability, an API-based advanced system is recommended.\n\n**Extrieve** - *Your Expert in Document Management \u0026 AI Solutions.*\n\n\u003chr/\u003e\n\n\u003ch2 align=\"center\"\u003e🌍 Explore • Build • Collaborate\u003c/h2\u003e\n\n\u003cp align=\"center\"\u003e\n  Whether you are evaluating, integrating, or contributing —\n  there are many ways to engage with Extrieve.\n\u003c/p\u003e\n\n\u003cbr/\u003e\n\n\u003cdiv align=\"center\"\u003e\n\n  \u003ca href=\"https://docs.extrieve.in/\" target=\"_blank\"\u003e\n    \u003cimg alt=\"Documentation\"\n         src=\"https://img.shields.io/badge/%20Documentation-APIs%20%26%20SDKs-0A66C2?style=for-the-badge\u0026logo=readthedocs\u0026logoColor=white\"\u003e\n  \u003c/a\u003e\n  \u0026nbsp;\n\n  \u003ca href=\"https://github.com/orgs/ExtrieveTechnologies/discussions\" target=\"_blank\"\u003e\n    \u003cimg alt=\"Community\"\n         src=\"https://img.shields.io/badge/%20Community-Open%20Discussions-6f42c1?style=for-the-badge\u0026logo=github\u0026logoColor=white\"\u003e\n  \u003c/a\u003e\n  \u0026nbsp;\n\n  \u003ca href=\"https://play.google.com/store/apps/details?id=com.extrieve.demo\" target=\"_blank\"\u003e\n    \u003cimg alt=\"Android Demo\"\n         src=\"https://img.shields.io/badge/%20Extrieve%20DEMO%20APP-34A853?style=for-the-badge\u0026logo=googleplay\u0026logoColor=white\"\u003e\n  \u003c/a\u003e\n  \u0026nbsp;\n\n  \u003ca href=\"https://contact.extrieve.com?ptype=QuickCapture_General\" target=\"_blank\"\u003e\n    \u003cimg alt=\"Contact\"\n         src=\"https://img.shields.io/badge/%20Connect-Talk%20to%20Us-00b894?style=for-the-badge\u0026logo=gmail\u0026logoColor=white\"\u003e\n  \u003c/a\u003e\n\n\u003c/div\u003e\n\n\u003cbr/\u003e\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd width=\"50%\" valign=\"top\"\u003e\n      \u003ch3\u003e🧑‍💻 For Developers\u003c/h3\u003e\n      \u003cp\u003e\n        Access SDKs, APIs, and integration guides designed for real-world,\n        production-scale deployments.\n      \u003c/p\u003e\n      \u003cp\u003e\n        \u003ca href=\"https://docs.extrieve.in/\" target=\"_blank\"\u003e\u003cb\u003eGet started with documentation →\u003c/b\u003e\u003c/a\u003e\n      \u003c/p\u003e\n    \u003c/td\u003e\n    \u003ctd width=\"50%\" valign=\"top\"\u003e\n      \u003ch3\u003e🤝 Open Collaboration\u003c/h3\u003e\n      \u003cp\u003e\n        Ask questions, propose ideas, share feedback, or discuss use cases\n        directly with the Extrieve team.\n      \u003c/p\u003e\n      \u003cp\u003e\n        \u003ca href=\"https://github.com/orgs/ExtrieveTechnologies/discussions\" target=\"_blank\"\u003e\u003cb\u003eJoin GitHub Discussions →\u003c/b\u003e\u003c/a\u003e\n      \u003c/p\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd width=\"50%\" valign=\"top\"\u003e\n      \u003ch3\u003e📲 Experience the SDK\u003c/h3\u003e\n      \u003cp\u003e\n        Try our Android demo app to explore document capture and AI features\n        in action.\n      \u003c/p\u003e\n      \u003cp\u003e\n        \u003ca href=\"https://play.google.com/store/apps/details?id=com.extrieve.demo\" target=\"_blank\"\u003e\u003cb\u003eView Android demo app →\u003c/b\u003e\u003c/a\u003e\n      \u003c/p\u003e\n    \u003c/td\u003e\n    \u003ctd width=\"50%\" valign=\"top\"\u003e\n      \u003ch3\u003e🏢 Work With Extrieve\u003c/h3\u003e\n      \u003cp\u003e\n        Interested in evaluation, enterprise integration,\n        partnerships, or joint development?\n      \u003c/p\u003e\n      \u003cp\u003e\n        \u003ca href=\"https://contact.extrieve.com?ptype=QC_ANDROID\" target=\"_blank\"\u003e\u003cb\u003eContact our team →\u003c/b\u003e\u003c/a\u003e\n      \u003c/p\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n\n\u003cbr/\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ci\u003e\n    Open to collaboration. Built for enterprise. Designed with developers in mind.\n  \u003c/i\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003csub\u003e\n    © 1996–2026 \u003ca href=\"https://www.extrieve.com/\"\u003eExtrieve Technologies\u003c/a\u003e. All rights reserved.\n  \u003c/sub\u003e\n\u003c/p\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fextrievetechnologies%2Fquickcapture_android","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fextrievetechnologies%2Fquickcapture_android","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fextrievetechnologies%2Fquickcapture_android/lists"}