Поделиться через


Ответ на обратные вызовы проверки подлинности

Сканер отпечатков пальцев работает в фоновом режиме в собственном потоке, а после завершения сообщает результаты сканирования, вызывая один из методов FingerprintManager.AuthenticationCallback в потоке пользовательского интерфейса. Приложение Android должно предоставить собственный обработчик, который расширяет этот абстрактный класс и реализует все следующие методы.

  • OnAuthenticationError(int errorCode, ICharSequence errString) — вызывается, когда возникает неустранимая ошибка. В этой ситуации ни приложение, ни пользователь уже не могут никак исправить ситуацию, кроме повторной попытки выполнить операцию.
  • OnAuthenticationFailed() — этот метод вызывается при обнаружении отпечатка пальца, но не распознаваемом устройством.
  • OnAuthenticationHelp(int helpMsgId, ICharSequence helpString) — вызывается, когда возникает ошибка восстановления, например пальцем проводится пальцем, чтобы быстро перевернуть сканер.
  • OnAuthenticationSucceeded(FingerprintManagerCompati.AuthenticationResult result) — Это вызывается при обнаружении отпечатка пальца.

Если при вызове Authenticate использовался CryptoObject, мы рекомендуем вызвать Cipher.DoFinal в OnAuthenticationSuccessful. DoFinal вызовет исключение, если шифр был изменен или неправильно инициализирован, то есть присутствуют признаки вмешательства внешних для приложения субъектов в результат работы сканера отпечатков пальцев.

Примечание.

Мы рекомендуем сохранять класс обратного вызова относительно небольшим и не размещать здесь логику конкретного приложения. Обратные вызовы должны действовать как "дорожный инспектор" при передаче результатов сканера отпечатков пальцев в приложение Android.

Пример обработчика обратного вызова для проверки подлинности

Следующий код содержит пример простейшей реализации FingerprintManager.AuthenticationCallback.

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 проверяет, была ли предоставлена Cipher для FingerprintManager при вызове Authentication. Если да, то вызывается метод DoFinal для шифра. Этот метод закрывает Cipher, восстанавливая его исходное состояние. Если возникла проблема с шифром, DoFinal выдаст исключение и попытка проверки подлинности будет считаться неудачной.

Обратные вызовы OnAuthenticationError и OnAuthenticationHelp получают целое число, указывающее причину проблемы. В следующем разделе описываются все возможные коды справки и ошибок. Два обратных вызова служат аналогичным образом, чтобы сообщить приложению о сбое проверки подлинности отпечатков пальцев. Они отличаются по степени серьезности. OnAuthenticationHelp обозначает устранимую ошибку, например слишком быстро проведенный по сканеру палец, а OnAuthenticationError — более серьезную ошибку, например повреждение сканера отпечатков пальцев.

Обратите внимание, что OnAuthenticationError будет вызываться при отмене сканирования отпечатка пальцев с помощью сообщения CancellationSignal.Cancel(). Параметр errMsgId будет иметь значение 5 (FingerprintState.ErrorCanceled). В зависимости от конкретных требований, реализация AuthenticationCallbacks может обрабатывать эту ситуацию не так, как другие ошибки.

OnAuthenticationFailed вызывается, когда отпечаток пальца успешно просканирован, но не соответствует ни одному из зарегистрированных на устройстве отпечатков.

Идентификаторы кодов помощи и сообщений об ошибках

Список и описание кодов ошибок и помощи можно найти в описании класса FingerprintManager из документации по пакету SDK для Android. Xamarin.Android представляет такие значения в перечислении Android.Hardware.Fingerprints.FingerprintState.

  • AcquiredGood — (значение 0) Полученное изображение было хорошим.

  • AcquiredImagerDirty — (значение 3) Изображение отпечатка пальца было слишком шумным из-за предполагаемой или обнаруженной грязи на датчике. Например, этот код разумно возвращать после нескольких попыток AcquiredInsufficient или при реальном обнаружении грязи (одинаковые пиксели на нескольких изображениях, полосы на изображении и т. п.). При возвращении такой ошибки ожидается, что пользователю нужно очистить датчик.

  • AcquiredInsufficient— (значение 2) Изображение отпечатка пальца было слишком шумным для обработки из-за обнаруженного состояния (т. е. сухой кожи) или, возможно, грязное датчика (см. раздел AcquiredImagerDirty.

  • AcquiredPartial — (значение 1) Обнаружено только частичное изображение отпечатка пальца. Во время регистрации пользователь должен быть проинформирован о том, что должно произойти, чтобы устранить эту проблему, например, "нажать твердо на датчике".

  • AcquiredTooFast — (значение 5) Изображение отпечатка пальцев было неполным из-за быстрого движения. Это состояние более типично для датчиков с линейным массивом, но может случиться и на других типах оборудования при движениях пальца во время сканирования. Пользователю следует предложить перемещать палец медленнее (если это линейный датчик) или дольше удерживать палец на сканере.

  • AcquiredToSlow — (значение 4) Изображение отпечатка пальца было нечитаемым из-за отсутствия движения. Это состояние более типично для датчиков с линейным массивом, на которых требуется движение пальца.

  • ErrorCanceled — (значение 5) Операция была отменена, так как датчик отпечатков пальцев недоступен. Например, такое может происходить при переключении пользователя, блокировке устройства или использовании (блокировке) датчика другой операцией.

  • ErrorHwUnavailable — (значение 1) Оборудование недоступно. Повторите попытку позже.

  • ErrorLockout — (значение 7) Операция была отменена, так как API заблокирован из-за слишком большого количества попыток.

  • ErrorNoSpace — (значение 4) Состояние ошибки, возвращаемое для операций, таких как регистрация; Операция не может быть завершена, так как осталось недостаточно хранилища для завершения операции.

  • ErrorTimeout — (значение 3) Состояние ошибки, возвращаемое при слишком длительном выполнении текущего запроса. Оно предназначено для того, чтобы программы не ожидали информации от датчика отпечатка пальца неограниченно долго. Время ожидания зависит от конкретных платформы и датчика, обычно около 30 секунд.

  • ErrorUnableToProcess — (значение 2) Состояние ошибки, возвращаемое, когда датчик не смог обработать текущее изображение.