Version history Pixelnetica™ Document Scanning SDK for Android
All notable changes to the Document Scanning SDK for Android are recorded here, so you can see what changed before updating.
3.2.0
Added
Runtime version reporting:
ScanningSdkLibrary.versionInforeturns the release version, build number, and source revision of the SDK build an application embeds — for About screens, logging, and support requests.Deterministic native-memory release: every SDK object backed by native memory (
ScanPicture,ScanReader,ScanText,ScanCutout,ScanDetector,FrameObserver,ScanLayout, theImageWriterfamily) now implementsAutoCloseable. Callclose()— or use Kotlin’suse { }/ Java’s try-with-resources — to free a page’s memory the moment you are done with it. For the scan types closing is optional (the garbage-collector fallback remains, so existing code runs unchanged) and idempotent, and it keeps native memory flat in multi-page loops. The writers are the exception: anImageWritermust be closed to finish its output file — andclose()now also releases its native memory, including when finishing fails.
Changed
The SDK is now distributed from
https://maven.pixelnetica.com/, which needs no account and no access token — add the repository and the dependencies, and that is the whole setup. Every file it serves is signed, with the public key athttps://maven.pixelnetica.com/KEYS. The releases 3.0.0, 3.0.1, 3.1.1, 3.1.2 and 3.1.3 are available there alongside this one;3.1.0, which only ever existed forsupport, and the-SNAPSHOTversions are not. See Add to a project.GitHub Packages is deprecated but active. It will keep receiving new releases for at least two more versions, and the final version published there will be named in the release that cuts it. Nothing already published is ever removed, so a project pinned to any existing version keeps resolving from it for as long as GitHub serves it; there is no date and no deadline. New projects should use
https://maven.pixelnetica.com/.The demo application no longer requests the advertising-ID permission, and no longer collects an advertising identifier. It showed no ads and had no advertising code; the permission arrived from Firebase Analytics and is now removed explicitly. Push messaging is removed with it — the demo asked for notification permission and never sent a notification — so it also stops requesting
POST_NOTIFICATIONSand the three permissions that came with the messaging and background-work libraries.The demo’s analytics and crash reporting now sit behind small vendor-agnostic seams.
AppAnalyticsandAppDiagnosticsdefine typed events and a reporting sink with no-op defaults, so the sample builds and behaves identically with no provider wired in — point them at your own analytics or crash reporter without touching the rest of the app. Crash reports carry the build identity that produced them, and warnings and errors the app logs become non-fatal reports rather than staying in the device log.The demo application’s source code now includes a full-featured demo license key — processed results are no longer watermarked. The key is bound to the demo application’s ID; a free trial license bound to your own application ID is available on request.
The camera viewfinder’s frame colours now match the iOS SDK’s smart camera: yellow while a document is being framed, green when automatic capture is imminent — previously the meanings were inverted. No API changes.
The camera’s shutter button is now disabled until the camera is ready to capture, instead of looking available while a tap is silently discarded. It also carries the accessibility label
Take photo, which doubles as the supported way for an automated UI test to address the control and read its readiness — see the camera guide.The API reference is now generated from the SDK sources and covers the whole supported surface: every public type, function, and parameter carries a description, wrong statements are corrected, deprecated API is documented and marked, and key pages carry code samples compiled against the SDK. The documentation set is rewritten and expanded alongside — new guides cover integration paths, native memory, colour profiles, application size, privacy, and troubleshooting.
Visible versions follow one convention shared with the iOS SDK: plain
MAJOR.MINOR.PATCHstrings, with build numbers derived from source-control history and recorded in each build together with its source commit.A failed OCR-language download shows a short localized message naming the cause — translated into all 14 supported locales — instead of raw technical text, with the technical details behind the failed row’s warning icon.
A
ScanReader.ProgressCallbackthat throws during recognition now has a verified contract: recognition is cancelled, the original exception reaches theScanPicture.read()caller unchanged, and the SDK remains fully usable.The language-selector and recognized-text composables no longer repeat internal side-effect work on every recomposition.
ArchiveandArchiveFailureincom.pixelnetica.design.lang.datagained a trailingfailureKindparameter, with the newArchive.FailureKindenum. They are:designimplementation detail rather than API to program against, but they are visible in the bytecode: Kotlin sources recompile unchanged, while binaries compiled against an older:designneed a recompile.The
supportlibrary’s shared-cache and cursor helpers are now safe for concurrent use.Hardened against malformed input across the engine: image loading, embedded document metadata, and license keys — including empty or corrupt key files — are rejected cleanly instead of risking crashes.
The crop surface can now be driven from a UI test:
CropCutoutCornersKeypublishes where the corner handles are currently drawn, in the coordinate space of the node carrying it, so a test can locate a real handle and drag it. Handle placement depends on the page, the outline and the current zoom, so previously there was nothing for a test to aim at and crop editing could only be checked by hand. The key is read-only and takes no part in gesture handling or drawing.
Fixed
A license key with a stray space or line break around it is no longer rejected. Reading a key from a file or a resource usually brings a trailing newline with it, and an otherwise valid key was refused because of a character you cannot see. Leading and trailing whitespace is now ignored. Whitespace inside a key is still an error, because it is not part of the key.
Saving pages to a PDF no longer crashes the application when the file cannot be created. If the destination folder is missing, storage is full, or the application has lost permission to write there, the write reports the failure as before — but closing the writer afterwards used to end the process, so an application that handled the error correctly still disappeared a moment later, with nothing saved and nothing shown to the user. Closing a writer whose output was never created is now safe, and so is closing one twice, so a failed export stays an ordinary error you can catch and report. Writing another page after a writer is closed is now refused with an exception instead of quietly starting a second document over the file just produced.
Rapid shutter presses no longer break the camera session. Previously two quick presses could leave the camera screen’s back button permanently dead, with the captured photos never handed to the application; the shot bookkeeping could also lose or double-count a capture when the screen was left and re-entered, or recreated by the system. A press while a capture is in flight is now ignored, every accepted capture is delivered exactly once, and a capture interrupted by a screen recreation is retaken automatically — the session always completes and the back button always returns the pages.
The shutter honours the between-shots countdown. After every capture the camera pauses briefly before the next one — the countdown shown in the viewfinder — but shutter presses used to bypass it and took a photo per press. During the countdown the shutter is now disabled and presses (including the volume key and tap-to-capture) do nothing; document detection stays quiet as well, even if it is toggled or the app returns to the foreground mid-countdown, and everything re-enables the moment the countdown ends.
Live camera frames are now assembled correctly before document detection sees them. Each frame plane is read through the geometry the camera reports for it, so rows carrying padding are no longer copied verbatim and colour information is emitted in the order the frame format defines — previously all three planes were concatenated as-is, which produced a malformed frame on every device tested.
The SDK no longer crashes on arm64 Android emulators, so development on Apple-Silicon Macs works end to end; real devices are verified unchanged image-for-image.
The demo application no longer stops working when a page’s image file goes missing. A page is stored as a database record plus image files on disk, and on a real device those can drift apart — a storage cleaner, a restore, or an interrupted save. When they did, the demo closed the moment it tried to show that page, and because the mismatch is permanent it closed again on every launch, leaving the application unusable until its data was cleared. Such a page now appears in the page list as a failed page explaining that its image is no longer on the device, and it can be deleted like any other. Opening it, cropping it or reading its text explains the same thing instead of waiting for an image that is never going to load, and exporting a document that would have to leave the page out says so rather than quietly producing a document without it. The housekeeping that removes unreferenced image files could also cause the mismatch itself, by deleting a page’s files moments after they were written; it now checks against the current store and no longer runs while a page is being saved. The sample’s page repository carries notes explaining the pattern, since an application that stores pages the same way faces the same drift.
The demo application keeps an edit made in the crop screen — a rotation as well as a reshaped outline — when you leave the screen. The save had been tied to the screen being redrawn one last time as the back stack unwound, which is not something the platform promises, so an edit could be dropped without any warning. It now runs as the screen goes away. The sample’s crop screen carries a note explaining the distinction, since the same pattern is easy to reproduce in an integrating application.
The demo application no longer closes when you share pages. The share dialog’s strip of page previews sized itself from those previews as they loaded, and they load in the background — so when the first one arrived at the moment the strip was being laid out, the strip was measured against a number of pages it did not yet have, and the application closed. It depended on timing rather than on which pages you picked, so any share could hit it. The strip now reserves one cell per selected page the moment it opens and fills each cell as its preview arrives, showing the document icon until then. The sample’s share dialog carries a note explaining why the number of cells is kept out of the loading state, since any list that sizes itself from data arriving in the background can fail the same way.
Text recognition handles full-resolution photos (12-50 MP) directly — no caller-side resize and no out-of-memory crash, with recognized text positions still reported in the original image’s coordinates — and a single malformed character no longer discards a page’s recognized text.
OCR language downloading no longer installs broken files: HTTP error pages, interrupted writes, and storage failures mark the download as failed and preserve both the installed languages and the previously fetched catalogue, devices without a usable Cronet provider fall back to the bundled network engine, and progress reporting copes with unusual server headers.
Editing recognized text no longer crashes when a deletion or keyboard edit overlaps a highlighted range.
FrameObserver.observe()validates frame buffers against the supplied geometry and format, accepts ARGB32 frames as documented, and a native failure during construction surfaces as a catchable exception instead of terminating the process.Image and PDF export fail with catchable errors instead of crashing or producing blank pages: unwritable output paths, failed page encodes, multi-page file naming, and receipt-style paper sizes are all fixed, and an abandoned TIFF write no longer leaks its native file handle.
Document detection and refine are hardened: extreme-aspect and oversized images return a clean no-document result, the evaluation-watermark path no longer risks memory corruption, and invalid resize or profile arguments throw the documented exceptions.
The camera screen stays up on devices without a usable back camera (reporting “Camera is not available” and returning the standard cancelled result), and its console no longer crashes during rotation or drops the last hint of a sequence.
Reading a
ScanTextorScanCutoutfrom a malformedParcelfails with a descriptive exception, andScanCutout.describeContents()follows theParcelablecontract.The
supportlibrary’s flow and lifecycle helpers honour their documented contracts:runLatestcancels superseded work, a failedSingletonretries its creation on the next call while a failedSingletonAsyncreports the failure on its state flow and rethrows the original cause, drag reordering accepts unmodifiable lists, and view-lifecycle waits survive view recreation.
3.1.3
Fixed
- Rotating the device into a 180-degree orientation while the camera screen was open crashed the application with “Invalid rotation value 2”. The rotation-animation helper in the
supportlibrary accepted only three of the four device orientations —ROTATION_180was absent from its accepted set — and rejected the fourth as invalid. All four orientations are now accepted.
3.1.2
Changed
- The camera module no longer uses the deprecated AndroidX
LocalBroadcastManager; its internal screen-to-screen notifications now go through thesupportlibrary instead.
Fixed
The camera, viewfinder, and OCR language screens now observe their state with lifecycle awareness, so a screen that is no longer visible stops receiving updates instead of continuing to be driven while stopped.
The cancel button on the OCR waiting panel no longer takes its color from the surrounding layout. It now carries its own publicly themable style attribute,
px_progress_cancel, which applications can override alongside the otherpx_*attributes of the SDK theme.
3.1.1
Added
- Full compatibility with modern Android devices featuring a 16KB memory page size.
Changed
Improved UI component support for Jetpack Compose; hybrid solutions are now deprecated.
Raised the minimum supported API level to 23.
Demo app and documentation updated for the latest DSSDK version.
General fixes and performance improvements.
3.0.1
Added
- Optical Character Recognition (OCR) option with support for over 100 languages.
- Runs entirely on-device, ensuring privacy and offline access by avoiding cloud processing.
- Handles multi-language documents in one process, with support for right-to-left (RTL) languages.
- Includes manual correction tools to improve accuracy.
- Export results as layered PDFs or plain text (TXT) files.
Smart orientation detection that automatically adjusts the orientation of scanned documents based on their content.
- PDF composing engine.
- Implements cutting-edge image compression techniques, delivering highly efficient file size reduction.
- Reduces file size by up to 90% for color and gray-scale images and 50% for black-and-white images, which helps save storage space, improve archiving, and enable faster sharing in low-bandwidth areas.
- Offers flexible compression levels, from “Lossless” preservation to “Extreme” optimization for color and gray-scale images.
- Supports the generation of layered PDF documents (aka. sandwiched PDF document), embedding searchable text above image layers to facilitate indexing, searching, and copying of text content.
- Key UI components are now modular and ready to integrate, including:
- Smart Camera module.
- OCR Language Management Interface.
- OCR results editor.
- Document border correction editor.
Changed
- EasyScan demo app:
- Features multipage scanning, editing, storing, and sharing capabilities.
- Includes a smart camera with multipage scanning and user guidance features.
- Built with Kotlin for a modern and efficient design.
- The API has been redesigned for better memory consumption, simplicity, and ease of integration, making it more accessible for developers working with diverse systems.
2.3.2
- Update: Color profile improvements for better text documents processing.
2.3.1
- New: Online DSSDK library distribution.## No need to update library manually anymore, it will be updated automatically through project level Gradle script. Please check “How to add Pixelnetica™ DSSDK to Android project” documentation section for more details.
- Update: License protection and key format.
2.3
- Update: license protection and key format now supporting subscription based licensing.
- Document corners support classes: corners regulation, average and stable detection.
2.2
- New: license protection system. Now we are using license keys as a protection method (as an addition to package ID bound). This also means that from now on no need to change demo library file with commercial one, but only to change license key on lib initialization.
2.1
- Effective Document area (the area document occupies in the viewfinder) and trapezoid distortion control: • automatic with ImageProcessing.detectDocumentCorners() additional parameters • using DocumentCutout class
- Custom corners validation moved to DocumentCutout specialized class
- No more need to call ImageWriter.destroy()
2.0
- New: document border detection algorithm with improved accuracy and speed.
- Custom corners validation using ImageProcessing.validateDocumentCorners() method
- New ability to write resulted document in various formats (Jpeg, Png, Tiff G4, PDF) with com.pixelnetica.imagesdk.ImageWriter subsystem.
- No need to configure ProGuard anymore. From now on it configured internally.
- Demo application update with new features implemented.
- Some API changes.
- Documentation update.
1.3.4
- Added PDF support.
- Documentation update.
- Minor demo application update.
1.3.3
- Added multipage TIFF support.
- New advanced camera in demo application now supports Smart Shot and handshaking detection.
- Demo application minor updates
Note: Demo application writes same page three times to Tiff file to demonstrate multipage possibilities.
1.3.2
- Minor documentation update.
- Demo application minor updates
- Demo application also provided as ready-to-install APK file (cropDemo.apk).
1.3.1
This is minor update — fixed some discrepancies in documentation.
1.3
- Sample application been updated.
- Added camera with live document boundary detection.
- SDK libs now provided in .aar format. Please check how to import them into your project in readme file.
- New way of SDK initialization. Find details and sample code in readme_first file.
- Eclipse version not supported anymore. If you’ll need sample application for Eclipse please request previous SDK demo version.