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/verifyEnrollmenttake optionalagentId(attribution),isMinor(relaxed quality), andattachments(metadata) parameters.- A
nullreturn is a handled failure (seesession.errors); it is never an exception. enrollmentStatusand how many fingers make a subjectfully_enrolledare backend-configured.