fbpx

Blog

Как сделать аутентификацию через отпечаток пальца или faceId? Изучаем AndroidX Biometric Library

Возможно, вы неоднократно задавались вопросом, как реализовать вход в приложение через отпечаток пальца или faceId? В этой статье мы поговорим как работать с AndroidX Biometric Library API и создадим небольшое приложение, которое предлагает пользователю пройти процесс аутентификации через отпечаток пальца.

Помимо красивого и удобного UI/UX ваше приложение должно быть экономным (потребляя не больше данных через интернет, чем необходимо) и производительным. Кроме того, ваше приложение должно быть безопасным. Библиотека AndroidX Biometric рассматривается как альтернатива устаревшему FingerprintManager и является рекомендуемым способом реализации авторизации при помощи отпечатка пальца. Раньше, если вам нужно было сделать вход по отпечатку пальца с FingerprintManager то у вас были следующие способы:

  • Cамостоятельно создать UI, добавлять различные состояния и реализовывать обработку ошибок и написать логику.
  • Скопировать пример от Google (Google’s sample)
  • Использовать стороннюю библиотеку.

К счастью, в Android 10 (API 29) была учтена обратная связь от разработчиков, и теперь появился единый интерфейс для использования биометрических датчиков (сканер отпечатка пальца и лица) для возможности аутентификации с помощью AndroidX Biometric Library API буквально в несколько строчек, при этом появился стандартный диалог, который избавит вас от ненужного кода и самостоятельного создания UI. Команда Android Framework and Security упаковала весь функционал в androidx.biometric, так что AndroidX Biometric Library API можно использовать на большинстве устройств, начиная с Android 6.0 (API level 23). Подробнее вы можете ознакомиться в статье от Google.

Для начала, скачайте заранее заготовленный проект и откройте его в AndroidStudio. После того, как необходимые зависимости скачаются, запустите проект.

Скачайте проект по ссылке и откройте его в AndroidStudio

После запуска приложения, вы должны увидеть пустой экран. Это будет отправная точка для добавления остального кода.

Стартовая точка для добавления AndroidX Biometric Library

Добавление Biometric Library в проект

Добавьте AndroidX Biometric Library в проект. Откройте build.gradle (Module:app) и добавьте AndroidX Biometric Library в раздел dependencies:

implementation 'androidx.biometric:biometric:1.0.1'

Не забудьте синхронизировать проект как показано ниже:

Нажмите Sync Now для синхронизации проекта

Работаем с Biometric API

Для работы с Biometric Api, необходимо инициализировать  BiometricPrompt и использовать callbacks. Откройте  MainActivity.kt и добавьте следующий код в конец метода onCreate:

val executor = ContextCompat.getMainExecutor(this)
val biometricManager = BiometricManager.from(this)

Здесь вы получите ссылку на  Executor  который будет выполнять работу в главном потоке и ссылку на  BiometricManager. Executor  будет нужен для передачи в диалог для авторизации, а biometricManager будет нужен для проверки, поддерживается ли вход по отпечатку пальца на девайсе или нет. Далее, добавьте код, показанный ниже сразу же после переменной  biometricManager:

when (biometricManager.canAuthenticate()) {
  BiometricManager.BIOMETRIC_SUCCESS ->
    authUser(executor)
  BiometricManager.BIOMETRIC_ERROR_NO_HARDWARE ->
    Toast.makeText(
        this,
        getString(R.string.error_msg_no_biometric_hardware),
        Toast.LENGTH_LONG
    ).show()
  BiometricManager.BIOMETRIC_ERROR_HW_UNAVAILABLE ->
    Toast.makeText(
        this,
        getString(R.string.error_msg_biometric_hw_unavailable),
        Toast.LENGTH_LONG
    ).show()
  BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED ->
    Toast.makeText(
        this,
        getString(R.string.error_msg_biometric_not_setup),
        Toast.LENGTH_LONG
    ).show()
}

В данном коде мы используем biometricManager для проверки поддерживает ли устройство вход по биометрическим данным или нет. Если нет, то мы показываем Toast c сообщением о том, что устройство не поддерживает вход по отпечатку пальца.

Добавление биометрической аутентификации

Если устройство поддерживает аутентификацию через отпечаток пальца, то мы попытаемся авторизовать пользователя, через метод  authUser , который принимает  executor в качестве параметра. Скопируйте код в MainActivity.kt как показано ниже:

private fun authUser(executor: Executor) {

}

В тело метода введите следующий код:

// 1
val promptInfo = BiometricPrompt.PromptInfo.Builder()
    // 2
    .setTitle(getString(R.string.auth_title))
    // 3
    .setSubtitle(getString(R.string.auth_subtitle))
    // 4
    .setDescription(getString(R.string.auth_description))
    // 5
    .setDeviceCredentialAllowed(true)
    // 6
    .build()

Давайте разберём, что тут написано:

  1. promptInfo: Здесь будет хранится ссылка на созданный с помощью  BiometricPrompt.PromptInfo билдер диалог для аутентификации.
  2. setTitle: Метод для установки заголовка диалогу.
  3. setSubtitle: Метод для установки подзаголовка для диалога
  4. setDescription: С помощью этого метода можно добавить описание для чего нужен этот диалог, чтобы пользователь понимал, что происходит.
  5. setDeviceCredentialAllowed(true): Если устройство не поддерживает аутентификации через отпечаток пальца, то этот метод позволяет использовать пин-код или графический паттерн для входа.
  6. build(): Метод, возвращающий экземпляр диалога с установленными выше значениями.

Теперь, после того как создали диалог для аутентификации, необходимо добавить обработку действий пользователя при взаимодействии с диалогом.

Добавление методов для обработки успешной аутентификации и обработка ошибки

Добавьте код сразу после инициализации promptInfo, показанный ниже, для обработки кейсов когда аутентификация прошла успешно и наоборот.

// 1
val biometricPrompt = BiometricPrompt(this, executor,
    object : BiometricPrompt.AuthenticationCallback() {
      // 2
      override fun onAuthenticationSucceeded(
          result: BiometricPrompt.AuthenticationResult
      ) {
        super.onAuthenticationSucceeded(result)
        main_layout.visibility = View.VISIBLE
      }
      // 3
      override fun onAuthenticationError(
          errorCode: Int, errString: CharSequence
      ) {
        super.onAuthenticationError(errorCode, errString)
        Toast.makeText(
            applicationContext,
            getString(R.string.error_msg_auth_error, errString),
            Toast.LENGTH_SHORT
        ).show()
      }
      // 4
      override fun onAuthenticationFailed() {
        super.onAuthenticationFailed()
        Toast.makeText(applicationContext,
            getString(R.string.error_msg_auth_failed),
            Toast.LENGTH_SHORT
        ).show()
      }
    })

Рассмотрим, что здесь написано:

  1. Инициализация переменнойbiometricPrompt имеющей тип BiometricPromptBiometricPromptпринимает 3 параметра: контекст, executor и коллбэки. Код, переданный в коллбэке сработает при успешной аутентификации и также при ошибке.
  2. Когда пользователь успешно войдет, то сработает метод onAuthenticationSucceeded который изменит видимость лэйаута с View.GONE на View.VISIBLE.
  3. Если во время аутентификации появится ошибка, то сработает метод  onAuthenticationError. В этом случае пользователю покажется Toast, с объяснением ошибки.
  4. onAuthenticationFailed: Этот метод вызывается когда пользователь ввел неверный код или отпечаток пальца не верный.

Наконец, добавьте этот код в конец метода authUser чтобы показать диалог:

biometricPrompt.authenticate(promptInfo)

Запустите проект. После этого вы увидите экран с диалогом

Диалог, показанный с помощью AndroidX BiometricPrompt

Ура, мы создали диалог, который может работать с отпечатком пальца. Кроме того, у пользователя есть возможность ввести пароль. В следующей части мы добавим работу с SharedPreference, чтобы хранить данные аккаунта.

Результат

Код проекта вы сможете скачать здесь

Понравилась статья? Подписывайся на telegram-канал и группу Вконтакте для получения самых интересных материалов по Android – разработке.

Статья основана на материалах: