github BlinkReceipt/blinkreceipt-android 2.5.0

2 hours ago

Recognizer SDK (2.5.0)

  • Breaking: com.microblink.ProductLookup is no longer public. This interface was never intended for public use, and its name now belongs to the new com.microblink.core.ProductLookup model described below. Remove any references to the old interface.
  • New: UPC product lookup is available again. RecognizerClient().lookup(upc) returns a Task<ProductLookup> with the product's name, brand, and URL, and whether the product is rewarded or its brand participates. Pass a CancellationToken as lookup(upc, token) to abandon the request, which cancels the task. The task never fails otherwise: network or server errors are reported in ProductLookup.message, and an unknown UPC returns an empty ProductLookup. Kotlin callers can tie the lookup to a coroutine with lookup(upc, cts.token).await(cts), which requires kotlinx-coroutines-play-services. This replaces com.microblink.barcode.RecognizerClient, which was removed with the barcode module.
    • The module now exposes com.google.android.gms:play-services-tasks as an API dependency, so Task and CancellationToken resolve at compile time.
  • New: last-resort merchant lookup at the end of a scan. When a US scan ends with no merchant after every other merchant detector has come up empty, the SDK now queries the Trip Resolution service. If a merchant comes back within 4 seconds, it fills ScanResults.merchantName with merchantSource set to TRIP_RESOLUTION. retailerId is filled from the result only when no retailer was already detected and the banner is a known Retailer value; otherwise it stays UNKNOWN. A failed, empty, or late response leaves the merchant null without surfacing an error. Duplicate detection and promotion validation now run after this lookup resolves, so they use the resolved merchant.
    • Action required if your app restricts outbound traffic: add api.actualplatform.com to your allow-list.
    • The lookup is US-only and honors your license's networking, PII, and in-scan restrictions.
    • For Camera UI and direct RecognizerView integrations, it runs on the final pass started by finishedScanning() and adds at most 4 seconds, only when the scan has no merchant.
  • New: RecognizerView.preliminaryResults(boolean tripResolution). Requests a preliminary snapshot that also runs the Trip Resolution lookup when the merchant is still missing; the no-argument overload is unchanged. These snapshots report PreliminaryResult.tripResolutionRequested() == true, and PreliminaryResult gains a matching four-argument constructor. Request it once, for the snapshot you will treat as final, since each request can wait up to 4 seconds. If the pass cannot run, or the scan is not eligible (non-US, or networking disabled by your license), you receive an empty snapshot that is still flagged tripResolutionRequested(); keep the snapshot you already have. In an activation session (ScanOptions.activation()), the pass skips promotion validation.
  • Improved receipt data extraction. Merchant, date, total, and product details are recognized more reliably. No integration changes are required.
    • Dates: lowercase month abbreviations (15-jun-2026) and more compact date-time formats (Jul6202611:46AM, Jul 23 1:50pM, Jul 17 2026 at 7:26:12 AM).
    • Transaction IDs: CHK, Ticket:, and Order Id: values are now recognized, with tighter validation to reduce false positives.
    • Duplicate detection now uses the authorization code attached to the receipt's last payment method.
    • Line items: once a receipt's subtotal balances against its products and discounts, later frames no longer add duplicate line items.
    • Merging frames into the scan results is faster on long receipts.
  • Fixed: a native crash while exporting scan results for receipts with certain coupon layouts, where a coupon's linked description line held no product or coupon description.
  • Merchant-detection data sent with scan summaries and duplicate checks now keeps the receipt's phone number (the phone match source is reported separately) and includes long-tail merchant matches.
  • Stability fixes and improvements

Account Linking SDK (2.5.0)

  • New error code: REAUTHENTICATION_REQUIRED (1010). When a retailer requires a human step during a background or order-fetch session, the SDK now reports REAUTHENTICATION_REQUIRED instead of a generic INTERNAL_ERROR, so your app can ask the user to sign in again in the foreground. It is non-recoverable and does not include a WebView. The code matches the iOS SDK.
  • Fixed: some retailer errors were reported as INTERNAL_ERROR instead of PARSING_FAILURE. This covers unsupported pages, unexpected retailer errors, and user-input timeouts. If your app special-cases INTERNAL_ERROR, these sessions now arrive as PARSING_FAILURE. Recoverability is unchanged: both are non-recoverable, with no WebView.
  • Stability fixes and improvements

Camera SDK (2.5.0)

  • Fixed: the camera did not open on Android 7.0–9 when only the CAMERA permission was granted. CameraView also required WRITE_EXTERNAL_STORAGE on API 28 and below, so apps that requested only CAMERA received onPermissionDenied() and never showed a preview. The camera never needed storage access: frames stay in memory, and anything persisted goes to app-specific storage. CAMERA is now the only permission checked on every supported API level. If you added the storage permission as a workaround, you can remove it.
  • Stability fixes and improvements

Camera UI SDK (2.5.0)

  • Activation flow: scans with no merchant now run the Trip Resolution lookup before they are handed to the Activation SDK. The camera requests one extra preliminary pass. In device testing this added about 3 seconds, and it is capped at 8 seconds, after which the snapshot is handed over without it. The pass is skipped when the scan already has a merchant, fails the receipt check, is outside the US, or networking is disabled by your license. Like the activation final pass, it skips promotion validation, which the Activation SDK performs itself. As a result, its snapshot carries no qualifiedPromotions, unqualifiedPromotions, or qualifiedSurveys, even when ScanOptions.validatePromotions() is set.
  • Stability fixes and improvements

Core SDK (2.5.0)

  • New: ScanResults.merchantDetection. Exposes the signals behind the scan's merchant (phone, logo, text, tax ID, CSV, product search, long-tail, and Trip Resolution matches), so a mis-detected merchant can be traced to the detector responsible for it. It is null when no detector produced a signal. These signals are not yet passed to the Activation SDK; that requires Activation SDK 1.3.0.
  • New: com.microblink.core.ProductLookup, the result model for UPC product lookup. It is a Parcelable with nullable upc, name, url, brand, and message, plus isRewarded() and isBrandParticipates(), which default to false.
  • Stability fixes and improvements

Digital SDK (2.5.0)

  • Stability fixes and improvements

Digital Analytics SDK (2.5.0)

  • Stability fixes and improvements

Earnings SDK (2.5.0)

  • Stability fixes and improvements

Logcat SDK (2.5.0)

  • Stability fixes and improvements

Security SDK (2.5.0)

  • Stability fixes and improvements

Surveys SDK (2.5.0)

  • Stability fixes and improvements

Don't miss a new blinkreceipt-android release

NewReleases is sending notifications on new releases.