Skip to Content
Android SDKConceptsFingerprint enrollment

Fingerprint enrollment lifecycle

Enrolling a finger takes two captures, not one. The first capture records the finger as an unverified print; a second, matching capture promotes it to verified. A subject is only enrolled once enough of their fingers are verified.

A finger’s states

(none) --enroll()--> unverified --verifyEnrollment() matches--> verified ^ | | | verify keeps failing → attempts exhausted +----------------------+ (backend resets the finger)
  • unverifiedsession.enroll(enrollee, position) captured the finger and stored a template, but nothing has confirmed it. The position appears in fetchEnrolled().nonVerified. An unverified finger does not count toward the subject being enrolled.
  • verifiedsession.verifyEnrollment(enrollee, position) captured the same finger again and it matched. The position moves from nonVerified to verified, and that finger is complete.

verifyEnrollment returns a VerificationResult: check positionVerified (did this position verify), verified / nonVerified (the subject’s current lists), enrollmentStatus, and requiresReenroll.

Subject status: partial vs full

enrollmentStatus describes the whole subject:

  • "partially_enrolled" — some target fingers are still missing or unverified.
  • "fully_enrolled" — enough fingers are verified. How many is required is configured by the backend, not the SDK — let enrollmentStatus tell you when you’re done rather than counting fingers yourself.

Only verified fingers advance the status. Ten enroll captures with no verifyEnrollment leaves the subject partially_enrolled.

fetchEnrolled is the source of truth

session.fetchEnrolled(enrollee) returns { verified, nonVerified, total, enrollmentStatus, notes }. It is a direct lookup against the Slade ID service — no hardware, no capture — so call it freely to check progress and branch on it. Track enrollment with fetchEnrolled, never with your own counters.

Reset and re-enroll

verifyEnrollment resolving positionVerified = false is a normal, expected outcome (smudge, wrong finger, poor placement): the finger stays unverified — prompt the user to retry the verify capture.

The backend allows a limited number of failed verify attempts per finger (backend-configured). VerificationResult.attemptsRemaining reports the budget when the server sends it, and requiresReenroll flips to true once the finger is reset — its record is deleted and it disappears from both verified and nonVerified. To recover, enroll the finger again, then verifyEnrollment.

Putting it together

For each target finger:

  1. enroll() — first capture, stores an unverified print.
  2. verifyEnrollment() — second capture; retry while positionVerified is false.
  3. fetchEnrolled() — if the finger vanished from both lists (or requiresReenroll), start it over at step 1.
  4. Repeat until enrollmentStatus == "fully_enrolled".

See Enroll a fingerprint for the worked loop.

Used in