...
We use the term file import
to refer to the Open with feature within Gini Bank SDK. From the point of view of the SDK, files are imported into the SDK from an outside source. It is unaware and can't set configuration related to enabling the client app to receive files via Android’s Open-with/Share functionality.
The “Open with…” feature can be found under different names in the Android phones, e.g: "Send to", "Share", “Share with” and "Open with".
Note |
---|
Please note that the “Open with (Share, Send to)” feature is disabled by default. To enable this feature, pass |
...
Register image and PDF file types
Note |
---|
Make sure the name of activity used in the below configuration is the same as the name of the activity handling your SDK implementation. In addition: Make sure that this activity is publically available. |
Add the following intent filter to the activity in your AndroidManifest.xml
to receive incoming images and PDF files:
...
We recommend adding ACTION_VIEW to the intent filter to let users send images and PDF files to your app from apps that don’t implement sharing with ACTION_SEND but enable viewing images and PDF files with other apps.
Handle imported files
When your app is requested to handle an image or a PDF file, your activity (declaring the intent filter shown above) is launched or resumed (onNewIntent()
) with the Intent
having ACTION_VIEW
or ACTION_SEND
.
...
Code Block | ||
---|---|---|
| ||
String action = intent.getAction(); if (Intent.ACTION_VIEW.equals(action) || Intent.ACTION_SEND.equals(action)) { ... } |
Launch the SDK as a fragment
If the Intent
passes the above check then register an activity result handler with the CaptureFlowImportContract()
and check for ACTION_VIEW and ACTION_SEND, then pass the Intent
to GiniBank.startCaptureFlowFortentcreateCaptureFlowFragmentForIntent()
:
Code Block | ||
---|---|---|
| ||
fun configureCapture() { GiniBank.setCaptureConfiguration(this, CaptureConfiguration( fileImportEnabled = true, ... // other configuration options ) ) } fun startGiniBankSDKForImportedFile(importedFileIntent: Intent) { // Use the androidx's Activity Result API to register a handler for the capture result. val captureImportLauncher = registerForActivityResult(CaptureFlowImportContract()) { result: CaptureResult -> Configure capture first configureCapture(); fileImportCancellationToken = GiniBank.createCaptureFlowFragmentForIntent(this /* activity context */, importedFileIntent) { result -> when (result) { is CaptureResult.Success GiniBank.CreateCaptureFlowFragmentForIntentResult.Cancelled -> { handleExtractionshandleCancellation(result.specificExtractions) } is CaptureResultGiniBank.CreateCaptureFlowFragmentForIntentResult.Error -> { when handleFileImportError(result.valueexception) { } is ResultErrorGiniBank.CreateCaptureFlowFragmentForIntentResult.CaptureSuccess -> { val// captureError:Opening GiniCaptureErrorthe = (result.value as ResultError.Capture).giniCaptureError file(s) from the intent and creating the CaptureFlowFragment handleCaptureError(captureError) } // Set the listener to receive isthe ResultError.FileImport -> { Gini Bank SDK's results val fileImportError = result.value as ResultError.FileImportfragment.setListener(this) handleFileImportError(fileImportError) } // Show the CaptureFlowFragment for example via the fragment manager: } } CaptureResult.Empty -> {requireActivity().supportFragmentManager.beginTransaction() handleNoExtractions() } .replace(R.id.fragment_container, result.fragment, "CaptureFlowFragment") CaptureResult.Cancel -> { handleCancellation() .addToBackStack(null) } } } fun handleFileImportError(exception: ImportedFileValidationException) { var message = ...commit() exception.validationError?.let { validationError -> } // Get the default message } message = getString(validationError.textResource) } } // Handle the Orresults usefrom customGini messagesBank SDK override fun onFinishedWithResult(result: CaptureResult) { message = when (validationErrorresult) { is CaptureResult.Success -> { FileImportValidator.Error.TYPE_NOT_SUPPORTED -> ... // Handle extraction results (to FileImportValidator.Error.SIZE_TOO_LARGE -> ...proceed with the transaction) FileImportValidator.Error.TOO_MANY_PDF_PAGES -> ...handleExtractions(result.specificExtractions) // After the user has FileImportValidator.Error.PASSWORD_PROTECTED_PDF -> ... seen (and maybe edited) the extractions and has executed the transfer FileImportValidator.Error.TOO_MANY_DOCUMENT_PAGES -> ... // please send }the transfer summary to Gini }with the final data AlertDialog.Builder(this) approved by the user. .setMessage(message) } .setPositiveButton("OK") { _, _is CaptureResult.Error -> finish(){ } .show() } funwhen startGiniBankSDKForImportedFile(importedFileIntent: Intent(result.value) { // Configure capture first configureCapture(); is ResultError.Capture fileImportCancellationToken-> = GiniBank.startCaptureFlowForIntent(captureImportLauncher, this, importedFileIntent) } |
Launch the SDK from a different activity
When your activity (declaring the intent filter shown above) is not the same as the activity from which you launch the Gini Bank SDK you need to create a Document
from the intent first and then pass it to your other activity as an extra. There you can then launch the SDK with the Document
.
Note |
---|
Passing the launch intent from the first activity to the other activity causes |
Create a Document
from the intent in your activity A:
...
language | kotlin |
---|
...
|
...
|
...
|
...
// |
...
There was a capture |
...
error |
...
|
...
|
...
val captureError = |
...
result. |
...
value as ResultError.Capture |
...
|
...
|
...
handleCaptureError(captureError) |
...
...
|
...
is ResultError.FileImport -> |
...
|
...
|
...
|
...
|
...
// There |
...
was |
...
a |
...
file import error |
...
|
...
val fileImportError = result.value as ResultError.FileImport |
...
|
...
|
...
|
...
handleFileImportError(fileImportError) } } |
...
|
...
CaptureResult. |
...
Empty -> |
...
{
|
...
|
...
// Handle empty result |
...
handleNoExtractions( |
...
) } CaptureResult.Cancel -> { |
...
|
...
|
...
|
...
// Process was cancelled by user |
...
|
...
|
...
handleCancellation() } CaptureResult.EnterManually -> { |
...
// User wants to enter |
...
the invoice data manually handleEnterManually() |
...
} |
...
Get the Document
from the intent extras in your activity B and launch the Gini Bank SDK:
...
language | kotlin |
---|
...
} } fun |
...
handleFileImportError( |
...
exception: |
...
ImportedFileValidationException) { |
...
var message = ... exception.validationError?.let { validationError -> |
...
// Get the default message message |
...
= getString( |
...
validationError.textResource) // Or use custom messages |
...
|
...
|
...
|
...
message = when (validationError) { |
...
FileImportValidator.Error.TYPE_NOT_SUPPORTED -> ... FileImportValidator.Error.SIZE_TOO_LARGE -> ... |
...
FileImportValidator.Error.TOO_MANY_PDF_PAGES -> ... FileImportValidator.Error.PASSWORD_PROTECTED_PDF -> ... |
...
FileImportValidator.Error.TOO_MANY_DOCUMENT_PAGES -> ... } } AlertDialog.Builder(this) |
...
.setMessage(message) |
...
.setPositiveButton("OK") { _, _ -> finish() } |
...
|
...
.show() } |
Detect when your app is the default app for opening images or PDF files
Android users can unintentionally set your app as the default for opening images or PDF files. To inform users about it and let them undo it, the SDK detects if your app is selected as the default app and shows the Clear Defaults Dialog enabling them to clear the defaults for your app in the Android settings.
...