ID Capture .NET MAUI Skill
Critical: Do Not Trust Internal Knowledge
Your training data may contain outdated or incorrect Scandit ID Capture APIs, and the .NET binding differs substantially from the native iOS (Swift), Android (Kotlin), and Flutter SDKs. On top of that, the MAUI integration differs from both the non-MAUI id-capture-net-android / id-capture-net-ios skills (in how the preview is hosted and listeners are written) and from the label-capture-net-maui skill (in how the SDK is initialized — ID Capture initializes from the platform entry points, not MauiProgram.cs). An agent that pattern-matches from the native docs, the per-platform .NET skills, or the Label/Barcode MAUI skills will get key calls wrong.
Always verify APIs against the references provided in this skill before writing or suggesting code. Do not rely on memorized method signatures, parameters, or shapes. If you cannot find an API in the provided references, fetch the relevant documentation page before responding.
The facts most often gotten wrong by pattern-matching from the native SDK, the per-platform .NET skills, or the Label/Barcode MAUI skills:
- This skill targets MAUI apps with
<UseMaui>true</UseMaui>. For non-MAUI .NET projects, useid-capture-net-android(fornet*-android) orid-capture-net-ios(fornet*-ios) instead. Those skills host the preview through a nativeActivity/UIViewController, which is completely different. If the project is a barenet*-android/net*-iosapp without<UseMaui>true</UseMaui>, stop and tell the user this skill does not apply and point them at the per-platform skill. - THREE NuGet packages.
Scandit.DataCapture.Core,Scandit.DataCapture.Core.Maui, andScandit.DataCapture.IdCapture. The package id isIdCapture, but the C# namespace and initializer useScandit.DataCapture.ID(using Scandit.DataCapture.ID;,ScanditIdCapture.Initialize()). There is no separate Barcode package (the PDF417/AAMVA reader is bundled inScandit.DataCapture.IdCapture) and noScandit.DataCapture.IdCapture.Mauipackage — ID Capture reuses the generic<scandit:DataCaptureView>fromCore.Maui. - Initialization is SPLIT and platform-specific — this is the biggest MAUI-vs-Label gotcha.
ScanditIdCapture.Initialize()is called from the platform entry points, notMauiProgram.cs: inPlatforms/Android/MainApplication.OnCreate()(beforebase.OnCreate()) and inPlatforms/iOS/AppDelegate.FinishedLaunching(beforebase.FinishedLaunching(...)). InMauiProgram.CreateMauiApp()you only chain.UseScanditCore(configure => configure.AddDataCaptureView())(which callsScanditCaptureCore.Initialize()and registers theDataCaptureViewMAUI handler). There is noUseScanditIdCapture()builder extension. (Contrast:label-capture-net-mauicallsScanditLabelCapture.Initialize()directly inMauiProgram.cs— do not copy that pattern here.) IdCaptureSettingsis configured with an object initializer / property sets — NOT a builder and NOT a bitmask. You setAcceptedDocuments(anIList<IIdCaptureDocument>) andScanner(anIdCaptureScanner). The Swift/Kotlin/oldsupportedDocuments+IdDocumentTypebitmask does not exist in .NET.- Documents are constructed with
new, taking anIdCaptureRegion:new Passport(IdCaptureRegion.Any),new DriverLicense(IdCaptureRegion.Us),new IdCard(IdCaptureRegion.Any),new ResidencePermit(...),new HealthInsuranceCard(...),new VisaIcao(...), andnew RegionSpecific(RegionSpecificSubtype.X).IdCaptureRegionvalues are C# PascalCase (Any,Us,EuAndSchengen, …), not the Swift/Kotlin style. - The scanner is a wrapper:
new IdCaptureScanner(physicalDocument: <IPhysicalDocumentScanner?>, mobileDocument: <MobileDocumentScanner?>). Physical =new FullDocumentScanner()(front+back, the default choice) ornew SingleSideScanner(barcode, machineReadableZone, visualInspectionZone). Mobile =new MobileDocumentScanner(iso180135, ocr). Assign it tosettings.Scanner. IdCaptureis created with a FACTORY, notnew:IdCapture.Create(dataCaptureContext, settings)(the constructor is private). There is also aCreate(settings)overload.- The preview is the generic
<scandit:DataCaptureView>XAML control with namespacexmlns:scandit="clr-namespace:Scandit.DataCapture.Core.UI.Maui;assembly=ScanditCaptureCoreMaui".DataCaptureContext="{Binding DataCaptureContext}"is mandatory — without it the preview renders as a black/blank camera even though the code compiles. The page'sBindingContextmust expose aDataCaptureContextproperty;x:Namealone is not enough. - The overlay must be created AFTER the platform handler attaches. Subscribe to
dataCaptureView.HandlerChangedand createIdCaptureOverlay.Create(idCapture)(the single-arg factory) there, thendataCaptureView.AddOverlay(overlay). Creating an overlay beforeHandlerChangedfires fails silently — there's no native view yet. The two-argCreate(idCapture, dataCaptureView)overload expects a native iOS/Android view, not the MAUI XAML control. - You manage the camera yourself, and
RecommendedCameraSettingsis applied to the camera (not passed toGetDefaultCamera):Camera.GetCamera(CameraPosition.WorldFacing)(orCamera.GetDefaultCamera()), thencamera.ApplySettingsAsync(IdCapture.RecommendedCameraSettings), thendataCaptureContext.SetFrameSourceAsync(camera), thencamera.SwitchToDesiredStateAsync(FrameSourceState.On/Off)across the page lifecycle.RecommendedCameraSettingsis a static property onIdCapture. - Listeners are PLAIN C# classes implementing
IIdCaptureListener(often the view model itself). They do not derive fromNSObject(that's the iOS skill) orJava.Lang.Object(that's the Android skill) — a single MAUI build serves both platforms, so no platform base class. - Results come via
IIdCaptureListenerwith TWO callbacks:OnIdCaptured(IdCapture, CapturedId)andOnIdRejected(IdCapture, CapturedId?, RejectionReason)(the idiomatic C# alternative is theIdCaptured/IdRejectedevents). Both run on a background/arbitrary thread — setidCapture.Enabled = falsewhile a result dialog is shown (re-enable afterwards), and dispatch UI work to the main thread viaMainThread.BeginInvokeOnMainThread(...)/MainThread.InvokeOnMainThreadAsync(...)/Application.Current.Dispatcher.DispatchAsync(...)(not Android'sRunOnUiThread, not iOS'sDispatchQueue.MainQueue). - Read field values via
CapturedId: top-levelFullName/FirstName/LastName(string?),DateOfBirth/DateOfExpiry/DateOfIssue(aDateResult?withDay/Month/Yearints plusUtcDate/LocalDate),DocumentNumber,Nationality,Sex(raw string) /SexType(Sexenum),Age,Address, and the document viaDocument?.DocumentType(IdCaptureDocumentType). The richer sub-results arecapturedId.Mrz/capturedId.Viz/capturedId.Barcode/capturedId.MobileDocument/capturedId.MobileDocumentOcr(note: properties areMrz/Viz/Barcode, notMrzResult/VizResult/BarcodeResult), pluscapturedId.ImagesandcapturedId.VerificationResult. - Document images are platform-typed.
capturedId.Images.Face/.Frame/.GetCroppedDocument(IdSide)/.GetFrame(IdSide)(andDataConsistencyResult.FrontReviewImage) returnAndroid.Graphics.Bitmap?on Android andUIKit.UIImage?on iOS. In portable MAUI code, guard image access with#if ANDROID/#if IOS, or convert to aStream/byte[]behind a service. The common scalar fields (name, dates, document number) are platform-neutral and need no#if. - Verification is settings-driven on .NET — there is NO
AamvaBarcodeVerifier/DataConsistencyVerifierclass. Enable checks viaIdCaptureSettingsflags (RejectForgedAamvaBarcodes,RejectInconsistentData,RejectNotRealIdCompliant, …) and read the outcome fromcapturedId.VerificationResult(DataConsistency/AamvaBarcodeVerification). See references/advanced.md. - NFC chip reading and the deserializer API are NOT in the .NET surface. Do not reference
NfcScanner,NfcResult,CapturedId.Nfc, orIdCaptureDeserializer— they don't exist on .NET. - Camera permission & platform config: iOS needs
NSCameraUsageDescriptioninPlatforms/iOS/Info.plist(plus a matchingMinimumOSVersionof15.0) andSupportedOSPlatformVersion≥15.0; Android needsandroid.permission.CAMERA(MAUI'sPermissions.Cameraadds it, or add it toAndroidManifest.xml) andSupportedOSPlatformVersion≥24(the MAUI template defaults to21, which fails the build against Scandit's Android AAR withuses-sdk:minSdkVersion 21 cannot be smaller than version 24). net10.0-androidruntime gotcha — mandatory kotlinx-serialization-json override.Scandit.DataCapture.IdCapture's nuspec declares a transitiveOrg.Jetbrains.Kotlinx.KotlinxSerializationJson1.7.3 — a community Gradle-sync binding (tuyen-vuduc/dotnet-binding-utils) that does not packkotlinx-serialization-json-jvm.jarinto the APK onnet10.0-android36.0. The app builds cleanly, then the first scan crashes withJava.Lang.NoClassDefFoundError: Failed resolution of: Lkotlinx/serialization/json/JsonKt;fromBlinkIdSdk.initializeSdk→PingManagerinside the VIZ backend. Override in the.csprojwith an Android-only<ItemGroup>that suppresses the community pair (bothKotlinxSerializationJsonandKotlinxSerializationJsonJvmneedExcludeAssets="all", or you'll getXA4215duplicate-binding errors) and adds Microsoft'sXamarin.KotlinX.Serialization.Json1.11.0 (which targetsnet10.0-android36.0and ships a real AAR withJsonKt.classpacked via the standardAndroidLibrarymechanism). See references/integration.md for the exact snippet.
Forbidden APIs (commonly hallucinated — do NOT emit these)
These compile-fail against the real .NET packages or break the MAUI integration. Use the right-hand form:
| Do NOT write | Use instead |
|---|---|
new IdCapture(...) / IdCapture.ForDataCaptureContext(...) |
IdCapture.Create(context, settings) |
IdCaptureSettings.builder() / settings.SupportedDocuments / IdDocumentType bitmask |
new IdCaptureSettings { AcceptedDocuments = [ … ], Scanner = … } |
settings.ScannerType = ... |
settings.Scanner = new IdCaptureScanner(physicalDocument: …, mobileDocument: …) |
ScanditIdCapture.Initialize() in MauiProgram.cs / UseScanditIdCapture() builder extension |
ScanditIdCapture.Initialize() in MainApplication.OnCreate (Android) and AppDelegate.FinishedLaunching (iOS) + .UseScanditCore(c => c.AddDataCaptureView()) in MauiProgram.cs |
IdCaptureOverlay.Create(idCapture, dataCaptureView) with the MAUI <scandit:DataCaptureView> |
IdCaptureOverlay.Create(idCapture) in HandlerChanged, then dataCaptureView.AddOverlay(overlay) |
IdCaptureOverlay.NewInstance(...) |
IdCaptureOverlay.Create(idCapture) |
RunOnUiThread(...) (Android) / DispatchQueue.MainQueue.DispatchAsync(...) (iOS) |
MainThread.BeginInvokeOnMainThread(...) / Application.Current.Dispatcher.DispatchAsync(...) |
listener : NSObject (iOS) / : Java.Lang.Object (Android) |
a plain C# class implementing IIdCaptureListener |
capturedId.MrzResult / capturedId.VizResult / capturedId.BarcodeResult |
capturedId.Mrz / capturedId.Viz / capturedId.Barcode |
capturedId.IsPassport() / IsDriverLicense() / IsIdCard() |
capturedId.Document?.DocumentType (IdCaptureDocumentType) or capturedId.IsRegionSpecific(subtype) |
new AamvaBarcodeVerifier(...) / new DataConsistencyVerifier(...) |
settings.RejectForgedAamvaBarcodes = true / RejectInconsistentData = true + read capturedId.VerificationResult |
NfcScanner / NfcResult / capturedId.Nfc / IdCaptureDeserializer |
(not available on .NET — no NFC / deserializer API) |
Scandit.DataCapture.IdCapture.Maui package / Scandit.DataCapture.Barcode package |
Scandit.DataCapture.Core + Scandit.DataCapture.Core.Maui + Scandit.DataCapture.IdCapture (three packages) |
relying on the transitive Org.Jetbrains.Kotlinx.KotlinxSerializationJson 1.7.3 on net10.0-android (builds clean but crashes at runtime in BlinkIdSdk.initializeSdk → PingManager with NoClassDefFoundError: kotlinx.serialization.json.JsonKt) |
add an Android-only <ItemGroup> to the .csproj with ExcludeAssets="all" on the community pair (Org.Jetbrains.Kotlinx.KotlinxSerializationJson and Org.Jetbrains.Kotlinx.KotlinxSerializationJsonJvm — both are required, otherwise XA4215) + Microsoft's Xamarin.KotlinX.Serialization.Json 1.11.0 (see references/integration.md) |
reading capturedId.Viz.DateOfBirth / .Nationality / .DocumentNumber |
those VIZ fields aren't on .NET — read them from the top-level capturedId.DateOfBirth / .Nationality / .DocumentNumber |
Product Guidance
Apply these rules whenever the user is making a design decision, not just an API question.
- Accept only the documents you actually need. A narrow
AcceptedDocumentslist (e.g. justnew DriverLicense(IdCaptureRegion.Us)) is faster and more accurate thanIdCaptureRegion.Anyacross every document type. Ask the user which documents and regions they expect before defaulting to "everything". - Pick the scanner that matches the data you need.
FullDocumentScanner()reads front and back automatically (best for most ID/DL use cases).SingleSideScanner(barcode, machineReadableZone, visualInspectionZone)reads a single side from the zone(s) you enable — use it when you only need, say, the PDF417 barcode on the back of a US DL, or only the MRZ of a passport.MobileDocumentScanneris for mobile driver's licenses (mDL). - Handle
OnIdRejected, not justOnIdCaptured. Rejections (RejectionReason.Timeout,NotAcceptedDocumentType,DocumentExpired,DocumentVoided,ForgedAamvaBarcode,InconsistentData, …) are how the user learns why a scan didn't succeed. A production integration must surface a message for them. - Anonymize by default if you don't need every field.
IdCaptureSettings.AnonymizationModeand per-field anonymization keep regulated data (document images, sensitive fields) out of the result unless you opt in. Recommend the minimum that satisfies the use case. - Hand off to the
data-capture-sdkskill for non-ID-Capture questions. If the user asks about another Scandit product (Barcode Capture, SparkScan, MatrixScan, Label Capture, etc.) or about choosing between products, defer to thedata-capture-sdkskill instead of guessing.
Intent Routing
Based on the user's request, load the appropriate reference file before responding:
- Integrating ID Capture from scratch, configuring accepted documents and the scanner, creating the mode, wiring SDK init across
MauiProgram.cs+ the platform entry points, hosting the<scandit:DataCaptureView>+IdCaptureOverlay, managing the camera lifecycle, handling captured/rejected IDs, and reading the commonCapturedIdfields (e.g. "add passport / driver's license scanning to my MAUI app", "read the holder's name and date of birth in MAUI", "my MAUI preview is black after adding ID Capture") → read references/integration.md and follow it. - Tuning the scanner (single-side / mobile docs), rejection rules (expired / voided / underage / expiring / forged-AAMVA / inconsistent), data-consistency & AAMVA verification, anonymization, reading the rich sub-results (MRZ / VIZ / PDF417 barcode / mobile document / images / driving-license details), or customizing the overlay (e.g. "reject expired IDs", "only read the back barcode of a US license", "verify the AAMVA barcode and detect forgeries", "anonymize the document images", "read the full MRZ", "change the viewfinder style") → read references/advanced.md and follow it.
API Usage Policy
Only use APIs that are explicitly documented in the Scandit references below. Do not invent or guess method signatures, parameters, property names, or imports. If unsure whether an API exists or how it is called — or if a compile error occurs — fetch the relevant reference page before responding. Do not tell the user to check the docs themselves. After answering, always include the relevant link so the user can explore further.
Never construct or guess documentation URLs. When you need a specific class or property's API page:
- First check whether the page you already fetched contains a direct hyperlink to it — topic pages link directly to relevant API symbols. Always request links alongside content in your fetch prompt.
- If no direct link was found, fetch the API index (see Full API reference in the table below), extract the actual link from it, and follow that.
URL structures can vary (e.g. an api/ui/ subdirectory) and guessing will lead to 404s.
References
Scandit publishes the .NET API reference per underlying TFM (dotnet.android and dotnet.ios). For MAUI projects both pages apply — the ID Capture API surface is identical between them; only a few platform notes differ (e.g. the document-image type, Bitmap vs UIImage).
| Topic | Resource |
|---|---|
| Get Started (Android target) | Get Started (.NET for Android) |
| Get Started (iOS target) | Get Started (.NET for iOS) |
| Advanced topics (scanners, rejection, verification, anonymization, overlay) | Android · iOS |
| Full API reference | ID Capture API (.NET Android) · ID Capture API (.NET iOS) |
API surface this skill covers
All classes documented with :available: dotnet.android and/or :available: dotnet.ios in the official RST docs (docs/source/id-capture/api/**) are addressed in the references. The .NET managed binding is shared across iOS and Android — the API surface is identical; only the platform plumbing (init location, camera permission, document-image type) differs, and MAUI adds the XAML hosting layer. ID Capture is available on dotnet.android / dotnet.ios since 6.16, but the modern document/scanner API (AcceptedDocuments, IdCaptureScanner, FullDocumentScanner) landed at 7.0, the rejection flags at 7.6, and the verification result model at 8.0 — so this skill targets a current 8.x stable.
IdCapture(Scandit.DataCapture.ID.Capture) — staticCreate(DataCaptureContext?, IdCaptureSettings)/Create(IdCaptureSettings);Context(get);Enabled(get/set —falsewhile a result is shown,trueto scan);ApplySettings(IdCaptureSettings);AddListener/RemoveListener(IIdCaptureListener); staticRecommendedCameraSettings(property);Feedback(get/set);Reset();event EventHandler<IdCapturedEventArgs> IdCaptured;event EventHandler<IdRejectedEventArgs> IdRejected;Dispose().IdCaptureSettings—new IdCaptureSettings()then set properties:Scanner(IdCaptureScanner),AcceptedDocuments/RejectedDocuments(IList<IIdCaptureDocument>),RejectVoidedIds,RejectExpiredIds,RejectIdsExpiringIn(Duration?),RejectNotRealIdCompliant,RejectForgedAamvaBarcodes,RejectInconsistentData,RejectHolderBelowAge(int?),DecodeBackOfEuropeanDrivingLicense,AnonymizationMode(IdAnonymizationMode),AnonymizeDefaultFields; methodsAddAnonymizedField(doc, IdFieldType),Get/SetShouldPassImageTypeToResult(IdImageType, bool),SetProperty/GetProperty. No builder.IdCaptureScanner—new IdCaptureScanner(IPhysicalDocumentScanner? physicalDocument, MobileDocumentScanner? mobileDocument);PhysicalDocument/MobileDocument(get).- Physical scanners (
IPhysicalDocumentScanner):new FullDocumentScanner();new SingleSideScanner(bool barcode, bool machineReadableZone, bool visualInspectionZone)(propsBarcode/MachineReadableZone/VisualInspectionZone). MobileDocumentScanner—new MobileDocumentScanner(bool iso180135, bool ocr);Ocr(get). (The ISO getter is bound asGetIso180135— rarely read.)- Documents (
IIdCaptureDocument, propsRegion+DocumentType):new IdCard(IdCaptureRegion),new DriverLicense(IdCaptureRegion),new Passport(IdCaptureRegion),new VisaIcao(IdCaptureRegion),new ResidencePermit(IdCaptureRegion),new HealthInsuranceCard(IdCaptureRegion),new RegionSpecific(RegionSpecificSubtype)(also exposesSubtype). IdCaptureRegionenum —Any,EuAndSchengen, and ~250 PascalCase country values (Us,Uk,Uae,Germany, …).IIdCaptureListener—OnIdCaptured(IdCapture, CapturedId),OnIdRejected(IdCapture, CapturedId?, RejectionReason). Implementations are plain C# classes in MAUI (noNSObject/Java.Lang.Objectbase).IdCapturedEventArgs(IdCapture,CapturedId) /IdRejectedEventArgs(IdCapture,CapturedId?,Reason).CapturedId(Scandit.DataCapture.ID.Data) —FirstName/LastName/FullName,Sex/SexType,DateOfBirth/DateOfExpiry/DateOfIssue(DateResult?),Nationality/NationalityISO,Address,Age(int?),Expired(bool?),Document(IIdCaptureDocument?),IssuingCountry/IssuingCountryIso,DocumentNumber/DocumentAdditionalNumber,Barcode/Mrz/Viz/MobileDocument/MobileDocumentOcr(sub-results),Images(IdImages),VerificationResult,UsRealIdStatus,CitizenPassport,AnonymizedFields; methodsIsRegionSpecific(subtype),IsAnonymized(field).DateResult—Day/Month/Year(int),LocalDate/UtcDate(DateTime).- Sub-results:
MrzResult,VizResult,BarcodeResult(large AAMVA surface),MobileDocumentResult,MobileDocumentOcrResult,DrivingLicenseDetails/DrivingLicenseCategory,ProfessionalDrivingPermit,VehicleRestriction— see references/advanced.md and the docs for full field lists. IdImages—Face,Frame,GetCroppedDocument(IdSide),GetFrame(IdSide)(eachAndroid.Graphics.Bitmap?on Android /UIKit.UIImage?on iOS — guard with#if ANDROID/#if IOSin portable MAUI code).IdCaptureOverlay(Scandit.DataCapture.ID.UI.Overlay) — staticCreate(IdCapture)(use this in MAUI) /Create(IdCapture, DataCaptureView?)(native view only);IdLayoutStyle(Rounded/Square),IdLayoutLineStyle(Bold/Light),TextHintPosition,ShowTextHints,CapturedBrush/LocalizedBrush/RejectedBrush+ staticDefault*Brush;SetFrontSideTextHint/SetBackSideTextHint.IdCaptureFeedback— staticDefaultFeedback(property);IdCaptured/IdRejected(Feedback).- Verification (
Scandit.DataCapture.ID.Verification) —VerificationResult(DataConsistency/AamvaBarcodeVerification),DataConsistencyResult(AllChecksPassed,FailedChecks/PassedChecks/SkippedChecksasDataConsistencyCheckflags,FrontReviewImage—Bitmap?/UIImage?),AamvaBarcodeVerificationResult(AllChecksPassed,Status),AamvaBarcodeVerificationStatus(Authentic/LikelyForged/Forged). No verifier classes — settings-driven. - Enums:
RejectionReason,IdCaptureDocumentType,RegionSpecificSubtype,IdSide,CapturedSides,Sex,UsRealIdStatus,IdAnonymizationMode,IdImageType,IdFieldType.Duration—new Duration(days, months, years). - MAUI-specific glue:
ScanditIdCapture.Initialize()inMainApplication.OnCreate/AppDelegate.FinishedLaunching,MauiAppBuilder.UseScanditCore(configure => configure.AddDataCaptureView()),<scandit:DataCaptureView>XAML control +DataCaptureContext="{Binding …}",dataCaptureView.HandlerChanged,dataCaptureView.AddOverlay(overlay), MAUIPermissions.Camera,MainThread.BeginInvokeOnMainThread. (DI helpersbuilder.Services.AddDataCaptureContext(licenseKey)/AddCamera(...)fromCore.Mauiare also available as an alternative to a manual singleton — see references/integration.md.)
Documented for other platforms but NOT on .NET — do not use
- NFC (
NfcScanner,NfcResult,NfcScannerListener,CapturedId.Nfc) — native iOS/Android only; not in the .NET surface. - Deserializer (
IdCaptureDeserializer,IIdCaptureDeserializerListener) — not on .NET. - Standalone
AamvaBarcodeVerifier— web/Xamarin only; on .NET useRejectForgedAamvaBarcodes+CapturedId.VerificationResult. CapturedId.VisaDetails/VisaDetails/ApplicationStatus,PassportType,MobileDocumentDataElement/MobileDocumentScanner.ElementsToRetain,LocalizedOnlyId,BarcodeMetadata,IdCaptureTrigger— not available on .NET.CapturedId.IsIdCard()/IsPassport()/IsDriverLicense()/ … helper methods — not on .NET; useDocument?.DocumentType.- Most name/identity fields on
VizResult(Sex,DateOfBirth,Nationality,Address,DocumentNumber,DateOfExpiry,DateOfIssue) — not on .NET; read them from the top-levelCapturedId.
MAUI vs per-platform / Label-MAUI differences (do not cross-pollinate)
- Packages: ID-Capture MAUI = 3 packages (
Core,Core.Maui,IdCapture), noIdCapture.Maui, noBarcode. (The per-platform skills use 2 packages —Core+IdCapture— with noCore.Maui.) - Init: ID-Capture MAUI =
ScanditIdCapture.Initialize()in the platform entry points (MainApplication.OnCreate/AppDelegate.FinishedLaunching) +.UseScanditCore(c => c.AddDataCaptureView())inMauiProgram.cs. (Label-MAUI callsScanditLabelCapture.Initialize()directly inMauiProgram.cs— different. The per-platform skills callScanditCaptureCore.Initialize()+ScanditIdCapture.Initialize()inMainApplication/AppDelegate.) - Hosting: MAUI
<scandit:DataCaptureView>XAML + overlay inHandlerChanged(single-argIdCaptureOverlay.Create(idCapture)+AddOverlay). (iOSDataCaptureView.Create(context, CGRect)+AddSubview+ two-arg overlay; AndroidDataCaptureView.Create(context)+container.AddView+ two-arg overlay.) - Listener base class: MAUI plain class; iOS
NSObject; AndroidJava.Lang.Object. - Main-thread dispatch: MAUI
MainThread.BeginInvokeOnMainThread/Application.Current.Dispatcher.DispatchAsync; iOSDispatchQueue.MainQueue/InvokeOnMainThread; AndroidRunOnUiThread. - Document images: MAUI is platform-typed (
Bitmap?on Android,UIImage?on iOS) and needs#if ANDROID/#if IOS; the per-platform skills each have a single concrete type.