Odpověď na zpětná volání pro ověřování

Skener otisků prstů běží na pozadí na vlastním vlákně a po dokončení bude hlásit výsledky kontroly vyvoláním jedné metody FingerprintManager.AuthenticationCallback ve vlákně uživatelského rozhraní. Aplikace pro Android musí poskytovat vlastní obslužnou rutinu, která rozšiřuje tuto abstraktní třídu, implementuje všechny následující metody:

  • OnAuthenticationError(int errorCode, ICharSequence errString) – Volá se, když dojde k neopravitelné chybě. Neexistuje nic dalšího, co by aplikace nebo uživatel mohl udělat k opravě situace s výjimkou možného pokusu znovu.
  • OnAuthenticationFailed() – Tato metoda se vyvolá, když zařízení detekuje otisk prstu, ale nerozpozná se.
  • OnAuthenticationHelp(int helpMsgId, ICharSequence helpString) – Volá se, když dojde k obnovitelné chybě, například prst potáhnutí prstem rychle přes skener.
  • OnAuthenticationSucceeded(FingerprintManagerCompati.AuthenticationResult result) – Volá se, když byl rozpoznán otisk prstu.

CryptoObject Pokud byl použit při volání Authenticate, doporučuje se volat Cipher.DoFinal .OnAuthenticationSuccessful DoFinal vyvolá výjimku, pokud byla šifra manipulována nebo nesprávně inicializována, což značí, že výsledek skeneru otisků prstů mohl být manipulován mimo aplikaci.

Poznámka:

Doporučuje se zachovat třídu zpětného volání relativně nízkou hmotnost a bez logiky specifické pro aplikaci. Zpětná volání by měla fungovat jako "dopravní policajt" mezi aplikací pro Android a výsledky skeneru otisků prstů.

Ukázková obslužná rutina zpětného volání ověřování

Následující třída je příkladem minimální FingerprintManager.AuthenticationCallback implementace:

class MyAuthCallbackSample : FingerprintManagerCompat.AuthenticationCallback
{
    // Can be any byte array, keep unique to application.
    static readonly byte[] SECRET_BYTES = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    // The TAG can be any string, this one is for demonstration.
    static readonly string TAG = "X:" + typeof (SimpleAuthCallbacks).Name;

    public MyAuthCallbackSample()
    {
    }

    public override void OnAuthenticationSucceeded(FingerprintManagerCompat.AuthenticationResult result)
    {
        if (result.CryptoObject.Cipher != null) 
        {
            try
            {
                // Calling DoFinal on the Cipher ensures that the encryption worked.
                byte[] doFinalResult = result.CryptoObject.Cipher.DoFinal(SECRET_BYTES);
    
                // No errors occurred, trust the results.              
            }
            catch (BadPaddingException bpe)
            {
                // Can't really trust the results.
                Log.Error(TAG, "Failed to encrypt the data with the generated key." + bpe);
            }
            catch (IllegalBlockSizeException ibse)
            {
                // Can't really trust the results.
                Log.Error(TAG, "Failed to encrypt the data with the generated key." + ibse);
            }
        }
        else
        {
            // No cipher used, assume that everything went well and trust the results.
        }
    }

    public override void OnAuthenticationError(int errMsgId, ICharSequence errString)
    {
        // Report the error to the user. Note that if the user canceled the scan,
        // this method will be called and the errMsgId will be FingerprintState.ErrorCanceled.
    }

    public override void OnAuthenticationFailed()
    {
        // Tell the user that the fingerprint was not recognized.
    }

    public override void OnAuthenticationHelp(int helpMsgId, ICharSequence helpString)
    {
        // Notify the user that the scan failed and display the provided hint.
    }
}

OnAuthenticationSucceeded zkontroluje, jestli Cipher byl poskytnut FingerprintManager , kdy Authentication byl vyvolán. Pokud ano, DoFinal metoda je volána na šifru. Tím se Cipherzavře , obnoví ho do původního stavu. Pokud došlo k potížím s šifrou, vyvolá DoFinal se výjimka a pokus o ověření by se měl považovat za neúspěšný.

Každá OnAuthenticationError zpětná OnAuthenticationHelp volání obdrží celé číslo označující, o jaký problém se jedná. Následující část vysvětluje všechny možné kódy nápovědy nebo chyb. Dvě zpětné volání slouží k podobným účelům – k informování aplikace, že ověřování otiskem prstu selhalo. Jak se liší závažností. OnAuthenticationHelp je uživatelsky obnovitelná chyba, jako je příliš rychlé potáhnutí otisku prstu; OnAuthenticationError je vážnější chyba, například poškozený skener otisků prstů.

Všimněte si, že OnAuthenticationError se vyvolá při zrušení skenování otisku prstu CancellationSignal.Cancel() prostřednictvím zprávy. Parametr errMsgId bude mít hodnotu 5 (FingerprintState.ErrorCanceled). V závislosti napožadavch AuthenticationCallbacks

OnAuthenticationFailed je vyvolána, když byl otisk prstu úspěšně naskenován, ale neodpovídá žádnému otisku prstu zaregistrovaného v zařízení.

Kódy nápovědy a ID chybových zpráv

Seznam a popis kódů chyb a kódů nápovědy najdete v dokumentaci k sadě Android SDK pro třídu FingerprintManager. Xamarin.Android představuje tyto hodnoty s výčtem Android.Hardware.Fingerprints.FingerprintState :

  • AcquiredGood – (hodnota 0) Získaná image byla dobrá.

  • AcquiredImagerDirty – (hodnota 3) Otisk prstu byl příliš hlučný kvůli podezření nebo zjištění nečistot na senzoru. Je například vhodné to vrátit po vícenásobné AcquiredInsufficient nebo skutečné detekci nečistot na senzoru (zablokované pixely, swathy atd.). Očekává se, že uživatel provede akci k vyčištění senzoru, když se vrátí.

  • AcquiredInsufficient – (hodnota 2) Obrázek otisku prstu byl příliš hlučný na zpracování z důvodu zjištěného stavu (tj. suchá kůže) nebo pravděpodobně špinavého senzoru (viz AcquiredImagerDirty.

  • AcquiredPartial – (hodnota 1) Byl zjištěn pouze částečný obrázek otisku prstu. Během registrace by měl být uživatel informován o tom, co se musí stát při řešení tohoto problému, například "pevně stiskněte na senzoru".

  • AcquiredTooFast – (hodnota 5) Otisk prstu nebyl kvůli rychlému pohybu neúplný. I když je to většinou vhodné pro lineární maticové senzory, může k tomu dojít také v případě, že se prst během získávání přesunul. Uživatel by měl být požádán, aby prst posouvat pomaleji (lineární) nebo nechal prst na senzoru delší.

  • AcquiredToSlow – (hodnota 4) Otisk prstu byl nečitelný kvůli nedostatku pohybu. To je nejvhodnější pro lineární maticové senzory, které vyžadují pohyb potáhnutím prstem.

  • ErrorCanceled – (hodnota 5) Operace byla zrušena, protože senzor otisku prstu není k dispozici. K tomu může dojít například při přepnutí uživatele, uzamčení zařízení nebo jiné čekající operaci, která ho zabrání nebo zakáže.

  • ErrorHwUnavailable – (hodnota 1) Hardware není k dispozici. Zkuste to později.

  • ErrorLockout – (hodnota 7) Operace byla zrušena, protože rozhraní API je uzamčeno kvůli příliš mnoha pokusům.

  • ErrorNoSpace – (hodnota 4) Stav chyby vrácený pro operace, jako je registrace; operaci nelze dokončit, protože k dokončení operace není dostatek úložiště.

  • ErrorTimeout – (hodnota 3) Stav chyby vrácený v případě, že aktuální požadavek běží příliš dlouho. To je určeno k tomu, aby programy nečekaly na snímač otisku prstu na neomezenou dobu. Časový limit je specifický pro platformu a senzor, ale obvykle je přibližně 30 sekund.

  • ErrorUnableToProcess – (hodnota 2) Stav chyby vrácený v případě, že senzor nemohl zpracovat aktuální obrázek.