The Mobscanner App (Available for Android at https://play.google.com/store/apps/details?id=com.mera.doc.scanner), designed to perform faster image scanning and produce quality PDFs with few clicks. The App aims to bring best quality images by removing shadows and any other noise from the input image. The heart of the App, the MobScanner SDK provides out of the box accurate, fast, and reliable mobile document scanning SDK for Android and IOS. Use any smart device to quickly and accurately digitize the documents you need. Implement the Ready-To-Use UI (RTU UI) with only a few lines of code cuts down the development cost and time for the business.
Operating System
• Android 5.0 (API Level 21) and higher
Hardware
• Rear-facing camera with autofocus
• Supported CPUs and Architectures (ABIs): armeabi-v7, arm64-v8a, x86, x86_64
The MobScanner SDK works completely offline. All data generated by the MobScanner SDK is only stored on the end user’s device and in absolutely no case ever transferred to a server / cloud service controlled by us. You as the customer will need to take care of uploading the scans / data to your backend, if desired.
Pick images from camera or gallery
Supports multiple image scanning
Inbuilt ID Card maker
Auto edge detection
Alignment correction
Perspective Transformation
Intelligent Image Filter for enhancement
Offline mode
API support
We will explain the usage of the SDK in the following section.
The SDK can be downloaded from maven using gradle. Add below line inside app module gradle file dependency section
implementation 'com.mobspace.mobscanner:docscannerlib:0.2.0' // or latest version
Also, add below lines in the project level gradle file
allprojects {
repositories {
google()
jcenter()
maven {
url 'https://mobspace.jfrog.io/artifactory/MobScannerSDK/'
}
maven { url 'https://jitpack.io' }
}
}
Additionally add runtime permission request for android.permission.WRITE_EXTERNAL_STORAGE,android.permission.READ_EXTERNAL_STORAGE,android.permission.CAMERA.
String writePermission = Manifest.permission.WRITE_EXTERNAL_STORAGE;
String readPermission = Manifest.permission.READ_EXTERNAL_STORAGE;
String cameraPermission = Manifest.permission.CAMERA;
List<String> list = new ArrayList<>();
boolean permissionGranted = ContextCompat.checkSelfPermission(this, writePermission) == PackageManager.PERMISSION_GRANTED;
if (!permissionGranted) {
list.add(writePermission);
}
permissionGranted = ContextCompat.checkSelfPermission(this, readPermission) == PackageManager.PERMISSION_GRANTED;
if (!permissionGranted) {
list.add(readPermission);
}
permissionGranted = ContextCompat.checkSelfPermission(this, cameraPermission) == PackageManager.PERMISSION_GRANTED;
if (!permissionGranted)
list.add(cameraPermission);
if (list.size() > 0) {
String[] array = new String[list.size()];
// Requesting the permission
ActivityCompat.requestPermissions(this, list.toArray(array),0);
}
In order to use the SDK, the developer needs an Unique Account Id (UUID) and an API Key. The UUID defines an unique ID for a vendor/bussiness, while API Key is specific to an App owned by the Vendor and it is unique to the "App Package Id". The same can be obtained by contacting us. However, for evaluation purpose there is an API key/UUID available in the sample project. Download the project and open in Android Studio to run the App. Please note, the given demo key wouldn't work in any other App. The sample project contains test apps both in Java and Kotlin.
The SDK can be integrated in Kotlin or Java based Android Apps. Once you get the API key and UUID, use the below code to initialize the App.
MobScannerSDK.init(YOUR_API_KEY, YOUR_UUID, getApplicationContext(), new ISdkInitCallback() {
@Override
public void onInitSuccess() {
Toast.makeText(getApplicationContext(), "Init successful", Toast.LENGTH_SHORT).show();
}
@Override
public void onInitError(@NotNull String message) {
Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT).show();
}
});
MobScannerSDK.init() is an asyn call. The initialization status would be reported through ISdkInitCallback interface callback. The Initialization would fail for invalid UUID or API Key.
Optionally, you can set theme to match the SDK UI with your App. Create or modify theme colour inside your styles.xml
<style name="MsScannerTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="windowActionModeOverlay">true</item>
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
Set the Theme using
MobScannerSDK.setTheme(R.style.MsScannerTheme);
Before using Camera or Gallery, make sure that your App has necessary permissions as described above.
Call InputImagePicker.fromCamera from an Activity instance. The captured images from the Camera Activity would be returned using onActivityResult callback.
InputImagePicker.fromCamera(Activity activity);
or
InputImagePicker.fromCamera(Activity activity, int requestCode, CameraConfig cameraConfig)
You can pass your own request code to handle inside onActivityResult callback. Additionally, you can pass CameraConfig object to control different camera UI options.
The CameraConfig class controls different UI options associated with the camera preview. Below are the methods available-
setShowGrid- Flag to show a 3x3 grid on the camera preview. Default value true
setEnableZoom- Flag to enable/disable pinch zoom. Default value true
setExposureCorrection- Flag to enable/disable exposure correction on vertical scroll up/down on the image preview. Default value true
setShowCapturePreview - Flag to enable/disable capture preview once an image has been captured. Default value false
setSingleImageMode - Flag to capture only one image (single shot). Default value false
You can request the SDK to load Gallery images using-
InputImagePicker.fromGallery(boolean isSingleSelect, Activity activity);
Where isSingleSelect flag enables the SDK to select single or multiple images from the Gallery.
Override onActivityResult to handle to camera or gallery image selection results
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case InputImagePicker.IMAGE_PICKER_CAMERA:
case InputImagePicker.IMAGE_PICKER_GALLERY: {
if (resultCode == Activity.RESULT_OK) {
// list of captured images
ArrayList<String> files = InputImagePicker.getImages(data);
}
}
}
}
Our RTU SDK UI enables you to quickly edit images and apply filters.
// Create optional output directory to store output images. Can be External storage or App own Storage using context.getExternalFilesDir
File dir = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/"+getString(R.string.app_name)+"/sample");
if(!dir.exists())
dir.mkdirs();
MobScannerActivityCreator.Builder builder = new MobScannerActivityCreator.Builder()
.with(getApplicationContext())
.setOutputDirectory(dir.getAbsolutePath()) // optional
.setInputFiles(files) // files captured from Camera or Gallery
// add observer for images, when user finishes edit. parameter 'this' should be LifecycleOwner
.observeForFinalDocument(this, arrayList -> {
//Final images output as list
});
builder.build().create();
By default, the SDK would store images as JPEG in phone's persistent storage. You can use inbuilt PDF generator to create PDF from images.
// jpegList the list of JPEG images
String outputFile = Image2Pdf.createPdf(jpegList,"pdf_file_name",getApplicationContext(),new PDFConfig());
Toast.makeText(MainActivity.this, "PDF save at " + outputFile, Toast.LENGTH_LONG).show();
PDFConfig class provides options to customize the generated PDF. Below are the methods to provide available options-
setQuality- To set the quality of the output images. Being 0 as min and 100 as max value. Default value set to 90
setApplyAutoMargin- Set flag to apply margin to the PDF pages. Default value false.
setPageSize- PageSize of the PDF. A4 is the default size. Supported sizes are- A3,A4,A5,Letter,PostCard,Legal
setWaterMarkEnabled- Flag to set enable water mark on the left bottom position of the PDF page. Default value false.
setWaterMarkText- Text to display as custom water mark text.
For any issue of the SDK please write to us. Or you can create a github issue here