Android document scanner that uploads straight to a WebDAV server or an SMB (SMB2/SMB3) network share — no file-name prompt, no extra questions.
- Google ML Kit Document Scanner (same engine as "WebDAV Scan"): automatic edge detection, auto-capture, crop and perspective correction, filters (color, grayscale, B/W), shadow / stain / finger removal.
- Single scan: tap → frame → shoot → Done → uploaded.
- Multi scan: tap → shoot as many pages as you want → Done → uploaded (one multi-page PDF and/or numbered JPGs).
- Automatic file name:
<prefix>yyyy-MM-dd_HH-mm-ss(e.g.scan_2026-10-28_15-47-12.pdf). Two scans in the same second get-2,-3; the upload usesIf-None-Match: *so an existing remote file is never overwritten. - Output format (settings): PDF, JPG, or both. Multi-page JPGs are named
..._01.jpg,..._02.jpg. - Reliable upload queue (WorkManager): waits for network, up to 8 automatic attempts (30 s → ~1 h backoff, ~2 h total), survives app close/reboot; live status with the last error; Retry now on retrying items, Retry on failed ones, Retry all.
- WebDAV: server URL, port, remote folder (created automatically if missing), Basic auth, password encrypted with Android Keystore, optional certificate pinning for self-signed servers (trust-on-first-use, SHA-256), http allowed for LAN/NAS with an explicit warning.
- SMB2 / SMB3 (alternative to WebDAV, selected with a toggle in settings):
- dialects SMB 3.1.1 → 2.0.2 only (SMB1 never used), message signing required by default, optional mandatory SMB3 AES encryption, optional DFS;
- local accounts: user + password, domain empty;
- domain accounts: domain field (e.g.
CONTOSO), orCONTOSO\user, or UPNuser@contoso.local; - authentication NTLMv2 (Kerberos is not available on Android);
- target folder tree created automatically, files created with
FILE_CREATEso nothing is ever overwritten.
- Languages: Italian on Italian devices, English everywhere else. UI labels in this README are the English ones (Italian: Test connection = Prova connessione, Retry = Riprova, Clear list = Pulisci elenco).
- About screen with credits, license and third-party components.
- Launcher shortcuts: long-press the icon → Single scan / Multi-page scan to open the camera directly.
| Server | Server field | Remote folder |
|---|---|---|
| Nextcloud | https://cloud.example.com |
/remote.php/dav/files/USER/Scans |
| ownCloud | https://oc.example.com |
/remote.php/webdav/Scans |
| Synology (WebDAV pkg) | https://nas.local port 5006 |
/home/Scans |
| Apache / nginx | http://192.168.1.10 port 8080 |
/dav/scans |
| Case | Host | Share | Subfolder | Domain | User |
|---|---|---|---|---|---|
| NAS, local account | 192.168.1.10 |
Scansioni |
mario |
||
| Windows PC, local account | PC-UFFICIO |
Scan |
In |
mario |
|
| File server, domain account | fs01.contoso.local |
Dati |
Scansioni/2026 |
CONTOSO |
mario |
| Pasted UNC path | \\fs01\Dati\Scansioni |
CONTOSO\mario |
Use Test connection to verify credentials and create the folder.
- Passwords (WebDAV and SMB) are encrypted with an AES-256-GCM key stored in the Android Keystore; backup and device-to-device transfer are disabled.
- No "trust all certificates" mode. Self-signed / local https servers (NAS, routers, IP addresses): Test connection shows the certificate (subject, issuer, expiry, SHA-256) and lets you trust it; it is then pinned. If the certificate changes (e.g. renewal), uploads stop and Test connection shows old/new fingerprints so you can accept the new one. The certificate probe sends no credentials.
- HTTP redirects are not followed, so credentials are never sent to another host.
http://with credentials requires explicit confirmation (Basic auth would travel in clear text).- SMB: SMB1 disabled, signing required by default, optional mandatory SMB3 encryption.
- Remote paths containing
./..are rejected; generated file names are sanitized. - Storage: scanner output is deleted from the cache as soon as it is queued; each local file is deleted right after its successful upload. Failed uploads keep their files for 3 days (tap the item → Retry / Delete), then they are deleted automatically. Orphan files and scanner leftovers are cleaned at every app start; Clear list asks for confirmation when uploads are not completed (queued, retrying, running or failed with the scan still on the phone), then cancels them and deletes their files.
- User-installed CAs are trusted (to support private/corporate CAs); remove them from the device if not needed.
Requirements: JDK 17, Android SDK 35 (Android Studio Ladybug or newer).
./gradlew assembleRelease # app/build/outputs/apk/release/FastScanner-<version>-release.apkOr push the repo to GitHub: the included workflow (.github/workflows/build.yml) builds debug and release APKs and attaches them as artifacts (and to a GitHub Release when you push a v* tag).
The release build is signed with the debug key so it installs directly; configure your own signingConfig for distribution.
Requires Google Play Services on the device (the ML Kit scanner module is downloaded automatically on first use). Min Android 7.0 (API 24).
GPL-3.0 — see LICENSE.