Skip to Content
Android SDKGuidesEnroll a fingerprint

Enroll a fingerprint

Enrollment is two captures per finger: enroll (unverified) then verifyEnrollment (verified). Track progress with fetchEnrolled, never your own counters. Read Fingerprint enrollment first.

One finger

val session = sdk.createFingerprintReaderSession(reader.id) val enrollee = "CR-123" val position = 2 // ISO 19794-4 finger position (0..10) // Capture 1 — store an unverified print. val enrolled = session.enroll(enrollee, position) ?: return // null → a handled failure was emitted on session.errors // Capture 2 — promote to verified. Retry while it doesn't match. var verified = session.verifyEnrollment(enrollee, position) while (verified != null && !verified.positionVerified && !verified.requiresReenroll) { // matched=false is normal — prompt "place the same finger again" verified = session.verifyEnrollment(enrollee, position) } if (verified?.requiresReenroll == true) { // attempts exhausted; the backend reset this finger — start over at enroll() }

All target fingers

Drive the loop from fetchEnrolled so you always act on server truth:

suspend fun enrollSubject(session: FingerprintReaderSession, enrollee: String, targets: List<Int>) { for (position in targets) { // Skip fingers already verified (e.g. resuming a paused enrollment). val state = session.fetchEnrolled(enrollee) if (state != null && position in state.verified) continue session.enroll(enrollee, position) ?: continue var v = session.verifyEnrollment(enrollee, position) while (v != null && !v.positionVerified && !v.requiresReenroll) { v = session.verifyEnrollment(enrollee, position) } if (v?.requiresReenroll == true) { // finger was reset — re-enroll it before moving on session.enroll(enrollee, position) session.verifyEnrollment(enrollee, position) } // Done when the subject is fully enrolled — let the server decide. if (session.fetchEnrolled(enrollee)?.enrollmentStatus == "fully_enrolled") break } }

Render progress

Collect session.state for the capture UI and session.errors for failures:

viewModelScope.launch { session.state.collect { render(it) } } // Scanning/Captured/… viewModelScope.launch { session.errors.collect { toast(it.message) } }

Notes

  • enroll / verifyEnrollment take optional agentId (attribution), isMinor (relaxed quality), and attachments (metadata) parameters.
  • A null return is a handled failure (see session.errors); it is never an exception.
  • enrollmentStatus and how many fingers make a subject fully_enrolled are backend-configured.

Used in