Aktualisiert am
15 Min. Lesezeit
Von Marvin Frankenfeld
Android-Dokumentenscanner mit Kotlin entwickeln
Diese Anleitung zeigt, wie Sie mit Kotlin und dem Docutain SDK 1.9.0.0 einen produktionsreifen Dokumentenscanner in eine native Android-App integrieren.
Der fertige Ablauf erfasst oder importiert Dokumente, erkennt ihre Kanten, korrigiert die Perspektive und bereitet die Seiten für PDF-Export, OCR oder strukturierte Datenextraktion auf. Die Verarbeitung erfolgt lokal auf dem Gerät; Ihre App entscheidet selbst, ob und wohin ein Ergebnis gespeichert oder übertragen wird.
Die Beispiele sind auf Android 16 (API-Level 36) ausgerichtet und verwenden die aktuelle Activity Result API. Für eine minimale Integration können Sie zunächst nur die Einrichtung und den Scanner umsetzen und OCR oder Datenextraktion später ergänzen.
- Mindestversion
- Android 6.0 / API 23
- Beispielziel
- Android 16 / API 36
- Verarbeitung
- 100 % lokal und offline
- Ergebnisse
- PDF, JPG, OCR und JSON
Direkt zur Einrichtung
Was Sie entwickeln
Ein mobiler Dokumentenscanner ist mehr als eine Kameraansicht. Ein zuverlässiger Scanprozess muss den Nutzer führen, das Dokument im Kamerabild erkennen, im richtigen Moment auslösen, die Perspektive korrigieren und ein konsistentes Ergebnis für die weitere Verarbeitung erzeugen.
Der Ablauf in dieser Anleitung:
- Die einsatzbereite Scan-Oberfläche von Docutain aus Ihrer Activity starten.
- Eine oder mehrere Seiten erfassen oder vorhandene Bilder importieren.
- Seiten prüfen, zuschneiden, drehen, filtern und sortieren lassen.
- Ein durchsuchbares PDF oder einzelne Seitenbilder exportieren.
- Optional den vollständigen OCR-Text lesen oder strukturierte Dokumentdaten als JSON extrahieren.
Docutain führt diese Schritte offline aus. Das ist besonders relevant, wenn Dokumente persönliche, finanzielle oder geschäftliche Daten enthalten und die Anwendung auch ohne Netzwerkverbindung funktionieren soll.
Praxisbeispiel
Vom Kamerabild zum verwertbaren Dokument
Eine Scanner-Integration muss auch mit schrägen Aufnahmewinkeln, Wellen im Papier und ungleichmäßiger Ausleuchtung umgehen. Docutain erkennt die Dokumentgrenzen und bereitet die Seite für Export, OCR oder Datenextraktion auf.
Vor der KorrekturGewellt, schräg aufgenommen und ungleichmäßig ausgeleuchtet
→
Nach der KorrekturEntzerrt, zugeschnitten und für die weitere Verarbeitung vorbereitet
Voraussetzungen für Android 16
| Komponente |
Empfohlene Konfiguration für diese Anleitung |
| Programmiersprache |
Kotlin |
| Minimale Android-Version |
Android 6.0 / API-Level 23 |
| Compile und Target SDK |
API-Level 36 für Android 16 |
| Android Gradle Plugin |
Eine aktuelle, mit API 36 kompatible Version; Docutain erfordert mindestens 8.0.2 |
| Testgerät |
Ein physisches Android-Gerät mit rückseitiger Kamera |
Setzen Sie compileSdk = 36 und targetSdk = 36, wenn Sie die App für Android 16 vorbereiten. Google Play verlangt ab dem 31. August 2026 für neue Apps und App-Updates grundsätzlich API-Level 36 als Zielversion; Ausnahmen für bestimmte Geräteklassen und spätere Änderungen finden Sie in den offiziellen Target-API-Anforderungen.
Docutain SDK 1.9.0.0 hinzufügen
1. Maven Central einbinden
Stellen Sie sicher, dass mavenCentral() in der settings.gradle verfügbar ist:
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
}
}
2. SDK-Module hinzufügen
Das UI-Modul enthält den Dokumentenscanner. Ergänzen Sie das DataExtraction-Modul, wenn Ihre App auch OCR oder strukturierte Datenextraktion benötigt.
def docutainSdkVersion = '1.9.0.0'
// Document Scanner UI
implementation("de.docutain:Docutain-SDK-UI:$docutainSdkVersion")
// Optional: OCR and structured data extraction
implementation("de.docutain:Docutain-SDK-DataExtraction:$docutainSdkVersion")
Wenn Sie OCR oder Datenextraktion verwenden, setzen Sie außerdem android.enableJetifier=true in der gradle.properties. Prüfen Sie vor einem späteren Versionsupdate den Android-SDK-Changelog auf Migrationshinweise.
3. Manifest prüfen
Das zusammengeführte App-Manifest muss für kamerabasiertes Scannen den Kamerazugriff enthalten:
<uses-permission android:name="android.permission.CAMERA" />
<!-- Use required="false" if the app also supports file-only import. -->
<uses-feature
android:name="android.hardware.camera"
android:required="false" />
Hochauflösende Dokumentbilder benötigen Arbeitsspeicher. Die Android-Einrichtung von Docutain empfiehlt deshalb, für die Host-App einen großen Heap zu aktivieren:
<application
android:largeHeap="true"
... >
</application>
SDK initialisieren
Initialisieren Sie Docutain, bevor der Scanner verfügbar ist. Ein produktiver Lizenzschlüssel ist an die applicationId der App gebunden. Für einen ersten Test kann das SDK 60 Sekunden ohne Schlüssel ausgeführt werden; für realistische Tests steht eine erweiterte kostenlose Testlizenz bereit.
import de.docutain.sdk.DocutainSDK
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val initialized = DocutainSDK.initSDK(
this.application,
"<YOUR-LICENSE-KEY>"
)
if (!initialized) {
val error = DocutainSDK.getLastError()
// Log the error and disable actions that require the SDK.
}
}
}
Lassen Sie keinen Scan starten, wenn die Initialisierung fehlgeschlagen ist. Für die Diagnose kann das SDK-Protokoll über die Docutain-Logger-API abgerufen und bei Bedarf an den Support übermittelt werden.
Dokumentenscanner starten
Registrieren Sie den Result Contract einmal als Property der Activity oder des Fragments. Starten Sie ihn mit einer neuen DocumentScannerConfiguration, sobald der Nutzer auf den Scan-Button tippt.
import de.docutain.sdk.ui.DocumentScannerConfiguration
import de.docutain.sdk.ui.ScanResult
private val documentScanResult = registerForActivityResult(ScanResult()) { success ->
if (success) {
// The scanned pages are now available through Docutain's Document APIs.
// Continue with PDF, image, OCR or data extraction.
} else {
// The user canceled the scan process.
}
}
private fun startDocumentScan() {
val configuration = DocumentScannerConfiguration()
documentScanResult.launch(configuration)
}
Die Standardkonfiguration unterstützt bereits automatische Aufnahme, mehrseitige Dokumente und die Seitenbearbeitung. Beginnen Sie mit diesen Vorgaben, testen Sie den vollständigen Ablauf und passen Sie nur die für Ihren Anwendungsfall benötigten Optionen an.
Scan und Import konfigurieren
Das folgende Beispiel aktiviert eine abschließende Seitenbestätigung und erlaubt eine erneute Aufnahme:
private fun startConfiguredScan() {
val configuration = DocumentScannerConfiguration().apply {
autoCapture = true
multiPage = true
confirmPages = true
pageEditConfig.allowPageRetake = true
}
documentScanResult.launch(configuration)
}
Weitere wichtige Konfigurationsentscheidungen:
- Automatische oder manuelle Aufnahme:
autoCapture steuert das Auslösen; allowCaptureModeSetting kann einen Schalter für Nutzer einblenden.
- Einzel- oder mehrseitig: Setzen Sie
multiPage = false, wenn genau eine Seite zulässig ist.
- Prüfablauf: Die Einstellungen für die Seitenbearbeitung steuern Zuschnitt, Filter, Drehung, Sortierung, erneute Aufnahme, Hinzufügen und Löschen.
- Kamera und Import: Als Quelle sind Kamera, ein oder mehrere Galeriebilder, von der App bereitgestellte Bilddateien oder Kamera mit Import-Button möglich.
- Branding: Farben, Icons, Button-Beschriftungen und Scannertexte lassen sich an die Host-App anpassen.
- Nutzerführung: Onboarding und Scan Tips sind optional und können Standard- oder eigene Inhalte verwenden.
Prüfen Sie die aktuelle Konfigurationsreferenz für Document Scan, bevor Sie sich in einer langfristig gepflegten Anwendung auf bestimmte Standardwerte verlassen.
PDF, Bilder, OCR und strukturierte JSON-Daten erzeugen
PDF erstellen
Nach einem erfolgreichen Scan erstellt Document.writePDF() abhängig von der gewählten Option und dem verfügbaren OCR-Modul ein durchsuchbares oder nicht durchsuchbares PDF. Bei langen Dokumenten kann die PDF-Erzeugung Zeit benötigen und sollte in einer produktiven App außerhalb des UI-Threads laufen.
import de.docutain.sdk.Document
import de.docutain.sdk.DocutainSDK
import java.io.File
val pdfFile = Document.writePDF(File(filesDir, "scanned-document.pdf"))
if (pdfFile == null) {
val error = DocutainSDK.getLastError()
}
Zusätzlich lassen sich Seitenformat und maximale Dateigröße vorgeben. Komprimierung tauscht Ausgabequalität und Verarbeitungszeit gegen eine kleinere Datei.
Seitenbilder exportieren
Mit Document.pageCount() und Document.writeImage() exportieren Sie JPG-Dateien. Seitenindizes beginnen bei 1. Alternativ können Sie Seiten als Bitmap oder ByteArray abrufen und zwischen gefilterter, nur zugeschnittener und ursprünglicher Quelle wählen.
val pageCount = Document.pageCount()
for (i in 1..pageCount) {
val file = File(filesDir, "Image$i.jpg")
val fileReturn = Document.writeImage(i, file)
}
OCR-Text lesen
import de.docutain.sdk.dataextraction.DocumentDataReader
val completeText = DocumentDataReader.getText()
val firstPageText = DocumentDataReader.getText(1)
Strukturierte Dokumentdaten extrahieren
val jsonData = DocumentDataReader.analyze()
Das zurückgegebene JSON kann Felder wie Adressen, Datumswerte, Beträge, Rechnungskennungen und Zahlungsreferenzen enthalten. Optionale Analyseoptionen stehen für BIC, Zahlungsstatus und SEPA-Gläubiger bereit. Konfigurieren Sie diese vor dem Scan und validieren Sie extrahierte Werte anhand Ihrer Geschäftsregeln, bevor sie automatisiert weiterverarbeitet werden.
Test-Checkliste für Android 16
compileSdk und targetSdk anzuheben, ist nur der erste Schritt. Testen Sie Scanner und umgebenden App-Ablauf unter Android 16 mindestens in diesen Bereichen:
- Kameraberechtigung: erste Anfrage, Ablehnung, spätere Freigabe und Widerruf.
- Edge-to-Edge-Layouts: keine Bedienelemente unter Status- oder Navigationsleiste.
- Predictive Back: Abbrechen und Verlassen der Scanneransichten verhalten sich wie erwartet.
- Große Displays und Rotation: Die Activity bleibt auf Tablets, Foldables und in skalierbaren Fenstern bedienbar.
- 16-KB-Speicherseiten: aktuelle arm64-Geräte oder Emulatoren mit der neuesten SDK-Version testen.
- Prozesswiederherstellung: Ablauf nach Hintergrundwechsel oder Neuerstellung der Host-Activity wiederholen.
- Echte Dokumente: unterschiedliche Papierformate, Beleuchtung, Hintergründe, Seitenzahlen und schwächere Geräte einbeziehen.
- Ergebnisverarbeitung: leere, abgebrochene und fehlgeschlagene Zustände vor Upload oder Speicherung prüfen.
Berücksichtigen Sie sowohl die Änderungen für alle Apps als auch die Änderungen für Apps mit Ziel-API 36 in Ihren Releasetests.
Häufige Integrationsfehler
- UI- und OCR-APIs verwenden, ohne die jeweils benötigten SDK-Module hinzuzufügen.
- Scanaktionen zulassen, obwohl
DocutainSDK.initSDK() den Wert false geliefert hat.
- PDF-Erzeugung oder umfangreiche Ergebnisverarbeitung im Main Thread ausführen.
- Den Kameraablauf ausschließlich im Emulator testen.
- OCR-Ergebnisse oder extrahierte Felder ohne anwendungsseitige Validierung als vollständig voraussetzen.
- Einen produktiven Lizenzschlüssel in eine App mit anderer
applicationId kopieren.
Offizielle Quellen
Technische Quellen zuletzt am 29. August 2026 geprüft.
HÄUFIGE FRAGEN
Android-Dokumentenscanner: Fragen zur Integration
Ja. Docutain verarbeitet Scans, OCR und unterstützte Datenextraktion lokal auf dem Gerät. Für eine spätere Speicherung oder Übertragung des Ergebnisses ist die Host-App verantwortlich.
Docutain SDK 1.9.0.0 benötigt Android 6.0, API-Level 23, oder neuer. Die Anwendung muss mindestens gegen API-Level 34 kompiliert werden; die Anleitung verwendet API-Level 36 für Android 16.
Ja. Der Scanner kann mit der Kamera, einer Galerieauswahl, von der App bereitgestellten Bilddateien oder einem kombinierten Kamera-und-Import-Modus starten.
Nein. Das UI-Modul stellt den Scanner bereit. Ergänzen Sie das DataExtraction-Modul, wenn die Anwendung zusätzlich OCR-Texterkennung oder strukturierte Dokumentdaten benötigt.
Nutzen Sie zunächst die Android-Showcase-App. Prüfen Sie anschließend mit einer kostenlosen Testlizenz Kameraberechtigungen, Edge-to-Edge-Layouts, Predictive Back, große Displays, Prozesswiederherstellung und den vollständigen Ergebnisablauf auf repräsentativen physischen Geräten.