← Scandit SDKCONTENT HISTORYWHAT CHANGED · RULE-BASED ANALYSIS
Update to Scandit SDK
Snapshot Sep 30, 2026 · 23:13 UTC · version 1.1.1
Collection source: not recorded for this historical snapshot.
First saved snapshot
No earlier snapshot is available to establish a change.
Compare saved observations
Download comparison JSONFull technical diff · 0 changed fields
Full snapshot data
{
"name": "matrixscan-count-android",
"description": "MatrixScan Count (BarcodeCount) in native Android projects (Kotlin/Java, `com.scandit.datacapture:barcode`) — counting and receiving barcodes in bulk with the BarcodeCountView UI in an Activity or Fragment, scanning against an expected/receiving list, clustering, status mode, explicitly managed camera. Use for integration, settings and symbology configuration, result handling, UI customization, or troubleshooting counting workflows.",
"included_files": [
{
"relative_path": "references/clustering.md",
"size_in_bytes": 6739
},
{
"relative_path": "references/group-scanning.md",
"size_in_bytes": 2517
},
{
"relative_path": "references/highlights.md",
"size_in_bytes": 7996
},
{
"relative_path": "references/integration.md",
"size_in_bytes": 28736
},
{
"relative_path": "references/list-scanning.md",
"size_in_bytes": 5460
},
{
"relative_path": "references/status-mode.md",
"size_in_bytes": 5442
}
],
"skill_md_contents": "---\nname: matrixscan-count-android\ndescription: MatrixScan Count (BarcodeCount) in native Android projects (Kotlin/Java, `com.scandit.datacapture:barcode`) — counting and receiving barcodes in bulk with the BarcodeCountView UI in an Activity or Fragment, scanning against an expected/receiving list, clustering, status mode, explicitly managed camera. Use for integration, settings and symbology configuration, result handling, UI customization, or troubleshooting counting workflows.\nlicense: Apache-2.0\nmetadata:\n author: scandit\n version: \"0.1.1\"\n---\n\n# MatrixScan Count Android Skill\n\n## Critical: Do Not Trust Internal Knowledge\n\nYour training data may contain outdated or incorrect Scandit SDK APIs. The MatrixScan Count API has\nevolved across SDK versions — classes, properties, and factory methods may have been renamed or\nrestructured, and the Android API differs from the iOS one in concrete ways (factory methods, listener\nnames, view construction).\n\n**Always verify APIs against the references provided in this skill before writing or suggesting code.**\nDo not rely on memorized method signatures, parameters, or property names. If you cannot find an API in\nthe provided references, fetch the relevant documentation page before responding.\n\nThe single most common mistake is assuming the view owns the camera: in MatrixScan Count the\n**`BarcodeCountView` does NOT own or manage the camera** — you create and drive the camera explicitly\n(`Camera.getDefaultCamera(...)`, apply `BarcodeCount.createRecommendedCameraSettings()`,\n`dataCaptureContext.setFrameSource(...)`, and switch its state across `onResume`/`onPause`). See\n`references/integration.md` (Camera section). (This is unlike `BarcodeArView` in MatrixScan AR, which\n*does* manage the camera internally — don't carry that habit over.)\n\nAndroid-specific gotchas worth flagging:\n\n- `BarcodeCount.forDataCaptureContext(dataCaptureContext, settings)` is the **static factory** that\n creates the mode — **not** a `BarcodeCount(...)` constructor and **not** `forContext(...)`.\n- `BarcodeCountView` is created with the **static `BarcodeCountView.newInstance(context, dataCaptureContext, barcodeCount)` factory** — not a constructor. There is an overload taking a `BarcodeCountViewStyle` (`ICON` / `DOT`) and one taking a `DataCaptureView`. The view does **not** add itself to the hierarchy — call `addView(...)`.\n- Recommended camera settings come from the **static** `BarcodeCount.createRecommendedCameraSettings()` — not a property like iOS's `recommendedCameraSettings`.\n- The result-collecting callback is `BarcodeCountListener.onScan(barcodeCount, session, data)` (the `FrameData` parameter is named `data`). It is called on an **internal recognition thread** — dispatch to the main thread with `runOnUiThread {}` before touching UI/app state. `onSessionUpdated` / `onObservationStarted` / `onObservationStopped` are optional default methods.\n- The List/Exit/SingleScan buttons are delivered by **`BarcodeCountViewUiListener`** (`barcodeCountView.uiListener`); per-barcode brushes/icons and barcode-tap callbacks are delivered by the **separate `BarcodeCountViewListener`** (`barcodeCountView.listener`). Prefer the `onListButtonTapped(view, snapshot)` / `onExitButtonTapped(view, snapshot)` overloads — the `snapshot` is a nullable `BarcodeCountSessionSnapshot?` (its `recognizedBarcodes` etc. give you the count at tap time; access with `snapshot?.…`). The single-arg `(view)` forms are **deprecated**.\n- Symbology names are uppercase with underscores: `Symbology.EAN13_UPCA`, `Symbology.QR` (not `QR_CODE`), `Symbology.CODE128`. Enable one with `settings.setSymbologyEnabled(symbology, true)` or a set with `settings.enableSymbologies(set)`. All symbologies are disabled by default.\n- Highlight appearance is customized per style: on the default **Icon style** customize the **icon** (`iconForRecognizedBarcode` returning a `BarcodeCountIcon`, or `setIconForRecognizedBarcode`); on the **Dot style** customize the **`Brush`** (`recognizedBrush` / `brushForRecognizedBarcode`). `Brush(fillColor, strokeColor, strokeWidth)` takes **Android color ints** and a `Float` width. A `BarcodeCountIcon` wraps a `ScanditIcon` built with `ScanditIconBuilder` (in `core.ui.icon`).\n- The hardware trigger takes a **key code**: `barcodeCountView.enableHardwareTrigger(keyCode)` (e.g. `KeyEvent.KEYCODE_VOLUME_DOWN`) — not a boolean.\n- `BarcodeCountSettings.filterSettings` is **read-only** — mutate the returned `BarcodeFilterSettings` in place; don't assign a new one.\n- `barcodeCount.beginClusterEditing()` returns a **nullable** `BarcodeClusterEditor?`.\n- The button-text setters are **methods, not properties**: `barcodeCountView.setNextGroupButtonText(\"…\")`, `setRedoButtonText(\"…\")`, `setTextForClusteringGestureHint(\"…\")`, `setTextForTapToUncountHint(\"…\")` — call them, don't assign. (Booleans/enums like `shouldShowTorchControl`, `groupScanningEnabled`, `expectedNumberOfBarcodesPerCluster` ARE Kotlin properties.)\n- Status mode uses the fixed **`BarcodeCountStatus`** enum (`EXPIRED`, `FRAGILE`, `LOW_STOCK`, …) via `BarcodeCountStatusItem.create(trackedBarcode, status)`.\n- Request the `CAMERA` permission at runtime before scanning starts; the manifest declaration alone is not sufficient. The SDK requires `minSdk` 24+.\n- Import classes from the exact packages in the **Package paths** table in `references/integration.md` — several are easy to misplace (`TrackedBarcode` is under `barcode.batch.data`, `BarcodeCountFeedback` under `barcode.count.feedback`, `Feedback` under `core.common.feedback`). Reading a barcode's payload is `trackedBarcode.barcode.data` — `TrackedBarcode` itself has no `data`.\n\n**Scan preview** (the iOS `scanPreviewEnabled` flow) is not available on Android — `scanPreviewEnabled`\ndoes not exist on `BarcodeCountSettings`; don't invent it, and say so if asked. Group scanning,\nper-barcode highlight icons, and cluster expectation status are all supported and covered in the\nreferences.\n\n## Scope\n\nThis skill is scoped to the **MatrixScan Count counting workflow**: `DataCaptureContext`, the\n`BarcodeCount` mode, `BarcodeCountSettings` (symbologies, per-symbology tuning,\n`expectsOnlyUniqueBarcodes`, clustering, filtering), `BarcodeCountView` (the built-in AR counting UI with\nIcon / Dot styles), the explicitly-managed camera frame source and lifecycle, `BarcodeCountListener` for\ncollecting scanned barcodes, the List / Exit / Single-Scan button callbacks (`BarcodeCountViewUiListener`),\nfeedback, control visibility, customizing the AR highlights (per-barcode **icon** on the Icon style or\n**brush** on the Dot style), status mode, clustering (including the expected-count status), group\nscanning, and scanning against an expected/receiving list (`BarcodeCountCaptureList` + `TargetBarcode`).\n\nAlso covered: **filtering** (count only some of the barcodes in the scene), the **hardware trigger**, and\ncarrying a previous batch across a background cycle (`setAdditionalBarcodes`) — see the Advanced\nconfigurations section of `integration.md`.\n\nOut of scope: **tote mapping (MS Map)** is not covered. Mention it only as a pointer.\n\n## Intent Routing\n\nBased on the user's request, load the appropriate reference file before responding:\n\n- **Setting up or adjusting the MatrixScan Count counting flow** (e.g. \"add MatrixScan Count to my app\", \"count barcodes in bulk\", \"store the scanned barcodes when the list button is tapped\", \"mute the beep\", \"use the Dot style\", restrict symbologies, show/hide a built-in control, filtering, hardware trigger) → read `references/integration.md` and follow the instructions there. If the project already has MatrixScan Count wired up, do not re-create the context, mode, view, camera, or lifecycle — locate the existing ones (grep for `BarcodeCountView`, then `BarcodeCount`) and change only what the user asked for.\n- **Customizing the look of the AR highlights** (e.g. \"change the highlight color\", \"use a custom icon per barcode\", \"color each barcode by its data\", \"use the dot style with custom colors\") → read `references/highlights.md`. Covers the Icon (default) vs Dot styles: on the Icon style customize the **icon** (`BarcodeCountIcon` built with `ScanditIconBuilder`, via `iconForRecognizedBarcode` / `setIconForRecognizedBarcode`); on the Dot style customize the **`Brush`** (`recognizedBrush`, `brushForRecognizedBarcode`, `setBrushForRecognizedBarcode`). (Reacting to taps lives in `integration.md`.)\n- **Scanning against a known list of expected barcodes** (e.g. \"scan against a manifest / receiving order\", \"check scans against an expected list\", \"show a progress bar of how many were found\", \"let the user accept or reject items that aren't on the list\") → read `references/list-scanning.md`. Covers `BarcodeCountCaptureList.create` + `TargetBarcode.create`, `setBarcodeCountCaptureList`, the `BarcodeCountCaptureListListener` (correct / wrong / missing / accepted / rejected barcodes), `disableModeWhenCaptureListCompleted`, the progress bar, and the not-in-list accept/reject action.\n- **Status mode** (e.g. \"annotate each counted barcode with a status\", \"mark items as expired / low stock\", \"show a status icon per barcode the user can review\") → read `references/status-mode.md`. Covers implementing `BarcodeCountStatusProvider` and registering it with `barcodeCountView.setStatusProvider(...)`, the `onStatusRequested(barcodes, callback)` flow building per-barcode `BarcodeCountStatusItem`s from the `BarcodeCountStatus` enum, the success / error / abort result types delivered via `callback.onStatusReady(...)`, and `shouldShowStatusModeButton` / `shouldShowStatusIconsOnScan`.\n- **Grouping barcodes into clusters** (e.g. \"group the barcodes on a multi-pack/pallet\", \"enable clustering\", \"let the user group scanned codes\", \"flag clusters whose count is off\") → read `references/clustering.md`. Covers `BarcodeCountSettings.clusteringMode` (`DISABLED` / `MANUAL` / `AUTO` / `AUTO_WITH_MANUAL_CORRECTION`), the expected-count check (`expectedNumberOfBarcodesPerCluster` + `Cluster.expectationStatus` / `ClusterExpectationStatus`), reading `session.recognizedClusters` (`Cluster.barcodes`), programmatic editing via `beginClusterEditing()` (`formCluster` / `dissolveCluster` / `endEditing`), and the `brushForCluster` / `onClusterTapped` listener callbacks.\n- **Group scanning** (e.g. \"let the user split the count into groups / one per pallet\", \"add Next Group / Redo controls\", \"enable group scanning\") → read `references/group-scanning.md`. Covers `BarcodeCountSettings.groupScanningEnabled` (adds the Next Group / Redo controls), the fact that results still come back as a flat list via the normal `BarcodeCountListener` (no grouped-result callback), and customizing the control labels via `setNextGroupButtonText` / `setRedoButtonText`.\n\n## API Usage Policy\n\nOnly use APIs that are explicitly documented in the Scandit references below. Do not invent or guess\nmethod signatures, parameters, or property names. If unsure whether an API exists or how it is called —\nor if a compile error occurs — fetch the relevant reference page before responding. Do not tell the user\nto check the docs themselves. After answering, always include the relevant link so the user can explore\nfurther.\n\n**Never construct or guess documentation URLs.** When you need a specific class or property's API page:\n1. First check whether the page you already fetched contains a direct hyperlink to it — topic pages link\n directly to relevant API symbols. Always request links alongside content in your fetch prompt.\n2. If no direct link was found, fetch the API index (see **Full API reference** in the table below),\n extract the actual link from it, and follow that.\n\nURL structures can vary (e.g. `api/ui/` subdirectory) and guessing will lead to 404s.\n\n## References\n\nUse this table to pick the right page to fetch for a given question, and include the link in your answer\nso the user can explore further.\n\n| Topic | Resource |\n|---|---|\n| Get Started | [Get Started (Android)](https://docs.scandit.com/sdks/android/matrixscan-count/get-started/) · [Sample](https://github.com/Scandit/datacapture-android-samples/tree/master/03_Advanced_Batch_Scanning_Samples/02_Counting_and_Receiving/MatrixScanCountSimpleSample) |\n| Advanced (capture list, status mode, brushes, filtering, clustering) | [Advanced Configurations](https://docs.scandit.com/sdks/android/matrixscan-count/advanced/) |\n| Overview | [MatrixScan Count Intro](https://docs.scandit.com/sdks/android/matrixscan-count/intro/) |\n| Full API reference | [Barcode (MatrixScan Count) API](https://docs.scandit.com/data-capture-sdk/android/barcode-capture/api.html) |\n"
}SHA-256: a4faaedae0fecb3a43d9086d30b00c77c8170a42a0be79a00dfe28817014d1e5