Udostępnij za pośrednictwem


Odpowiadanie na wywołania zwrotne uwierzytelniania

Skaner linii papilarnych działa w tle we własnym wątku, a po zakończeniu będzie raportować wyniki skanowania, wywołując jedną metodę FingerprintManager.AuthenticationCallback w wątku interfejsu użytkownika. Aplikacja systemu Android musi udostępnić własną procedurę obsługi, która rozszerza tę abstrakcyjną klasę, implementuje wszystkie następujące metody:

  • OnAuthenticationError(int errorCode, ICharSequence errString) — wywoływana, gdy występuje nieodwracalny błąd. Nie ma więcej aplikacji lub użytkownika może zrobić, aby poprawić sytuację, z wyjątkiem ewentualnie spróbować ponownie.
  • OnAuthenticationFailed() — Ta metoda jest wywoływana, gdy wykryto odcisk palca, ale nie został rozpoznany przez urządzenie.
  • OnAuthenticationHelp(int helpMsgId, ICharSequence helpString) – Wywoływany, gdy występuje błąd możliwy do odzyskania, taki jak palcem przesuwanym szybko nad skanerem.
  • OnAuthenticationSucceeded(FingerprintManagerCompati.AuthenticationResult result) — Jest to wywoływane po rozpoznaniu odcisku palca.

CryptoObject Jeśli element został użyty podczas wywoływania Authenticatemetody , zaleca się wywołanie Cipher.DoFinal metody w pliku OnAuthenticationSuccessful. DoFinal zgłosi wyjątek, jeśli szyfr został naruszony lub nieprawidłowo zainicjowany, co oznacza, że wynik skanera linii papilarnych mógł zostać naruszony poza aplikacją.

Uwaga

Zaleca się, aby klasa wywołania zwrotnego była stosunkowo lekka i wolna od logiki specyficznej dla aplikacji. Wywołania zwrotne powinny działać jako "policjant ruchu" między aplikacją systemu Android a wynikami skanera linii papilarnych.

Przykładowa procedura obsługi wywołania zwrotnego uwierzytelniania

Poniższa klasa jest przykładem minimalnej FingerprintManager.AuthenticationCallback implementacji:

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 sprawdza, czy Cipher element został podany do FingerprintManager momentu Authentication wywołania. Jeśli tak, DoFinal metoda jest wywoływana na szyfrze. Spowoduje to zamknięcie Cipherelementu , przywrócenie go do stanu pierwotnego. Jeśli wystąpił problem z szyfrem, zgłosi wyjątek, a DoFinal próba uwierzytelniania powinna zostać uznana za nieudaną.

Wywołania OnAuthenticationError zwrotne i OnAuthenticationHelp otrzymują liczbę całkowitą wskazującą, jaki był problem. W poniższej sekcji opisano każdą z możliwych kodów pomocy lub błędów. Dwa wywołania zwrotne służą podobnym celom — aby poinformować aplikację, że uwierzytelnianie odciskiem palca nie powiodło się. Czym się różnią, jest ważność. OnAuthenticationHelp to błąd możliwy do odzyskania przez użytkownika, taki jak zbyt szybkie przesuwanie odcisku palca; OnAuthenticationError jest bardziej poważnym błędem, takim jak uszkodzony skaner linii papilarnych.

Pamiętaj, że OnAuthenticationError zostanie wywołana po anulowaniu skanowania odciskiem CancellationSignal.Cancel() palca za pośrednictwem wiadomości. Parametr errMsgId będzie miał wartość 5 (FingerprintState.ErrorCanceled). W zależności od wymagań implementacja AuthenticationCallbacks programu może traktować tę sytuację inaczej niż inne błędy.

OnAuthenticationFailed jest wywoływany, gdy odcisk palca został pomyślnie zeskanowany, ale nie pasuje do żadnego odcisku palca zarejestrowanego w urządzeniu.

Kody pomocy i identyfikatory komunikatów o błędach

Listę i opis kodów błędów oraz kodów pomocy można znaleźć w dokumentacji zestawu Android SDK dla klasy FingerprintManager. Xamarin.Android reprezentuje te wartości z wyliczeniem Android.Hardware.Fingerprints.FingerprintState :

  • AcquiredGood — (wartość 0) Uzyskany obraz był dobry.

  • AcquiredImagerDirty – (wartość 3) Obraz odcisku palca był zbyt hałaśliwy ze względu na podejrzenie lub wykrycie brudu na czujniku. Na przykład rozsądnie jest zwrócić to po wielokrotnym AcquiredInsufficient lub rzeczywistym wykryciu brudu na czujniku (zablokowane piksele, pokosy itp.). Oczekuje się, że użytkownik podejmie działania w celu oczyszczenia czujnika, gdy zostanie zwrócony.

  • AcquiredInsufficient – (wartość 2) Obraz odcisku palca był zbyt hałaśliwy do przetworzenia z powodu wykrytego stanu (tj. suchej skóry) lub ewentualnie zanieczyszczonego czujnika (patrz AcquiredImagerDirty.

  • AcquiredPartial — (wartość 1) Wykryto tylko częściowy obraz odcisku palca. Podczas rejestracji użytkownik powinien być poinformowany o tym, co należy zrobić, aby rozwiązać ten problem, np. "mocno naciskać na czujnik".

  • AcquiredTooFast – (wartość 5) Obraz odcisku palca był niekompletny z powodu szybkiego ruchu. Chociaż w większości odpowiednie dla czujników macierzy liniowej, może się to zdarzyć również wtedy, gdy palec został przeniesiony podczas pozyskiwania. Użytkownik powinien zostać poproszony o przesunięcie palca wolniej (liniowego) lub pozostawienie palca na czujniku dłużej.

  • AcquiredToSlow – (wartość 4) Obraz odcisku palca był nieczytelny z powodu braku ruchu. Jest to najbardziej odpowiednie w przypadku czujników macierzy liniowej, które wymagają przesunięcia ruchu.

  • ErrorCanceled — (wartość 5) Operacja została anulowana, ponieważ czujnik odcisku palca jest niedostępny. Na przykład może się to zdarzyć, gdy użytkownik zostanie przełączony, urządzenie jest zablokowane lub inna oczekująca operacja uniemożliwia lub wyłącza go.

  • ErrorHwUnavailable — (wartość 1) Sprzęt jest niedostępny. Spróbuj ponownie później.

  • ErrorLockout — (wartość 7) Operacja została anulowana, ponieważ interfejs API jest zablokowany z powodu zbyt wielu prób.

  • ErrorNoSpace — (wartość 4) Stan błędu zwracany dla operacji, takich jak rejestracja; nie można ukończyć operacji, ponieważ nie ma wystarczającej ilości miejsca do ukończenia operacji.

  • ErrorTimeout — (wartość 3) Stan błędu zwracany, gdy bieżące żądanie działa zbyt długo. Ma to na celu uniemożliwienie programom oczekiwania na czujnik odcisku palca na czas nieokreślony. Limit czasu jest specyficzny dla platformy i czujnika, ale zazwyczaj wynosi około 30 sekund.

  • ErrorUnableToProcess — (wartość 2) Stan błędu zwracany, gdy czujnik nie może przetworzyć bieżącego obrazu.