Android Studio: урок Kotlin — биометрия с BiometricPrompt

Пароли запоминать неудобно, а вводить их каждый раз — долго. Современные смартфоны предлагают более быстрый и безопасный способ подтверждения личности — отпечаток пальца или сканирование лица. В Android для этого существует удобный класс BiometricPrompt, который прячет всю сложность взаимодействия с датчиками за простым интерфейсом. Сегодня в Android Studio мы научимся встраивать биометрию в приложение на языке Kotlin. Этот урок покажет, как показать стандартный диалог подтверждения и получить результат за несколько строк.


Что такое BiometricPrompt и зачем его использовать

BiometricPrompt — это часть библиотеки AndroidX Biometric, которая предоставляет единый диалог для подтверждения личности пользователя. Он автоматически определяет, какой способ биометрии доступен на устройстве: отпечаток пальца, распознавание лица или радужной оболочки глаз. Разработчику не нужно думать о разных сенсорах — достаточно вызвать один метод и обработать ответ.

Диалог выглядит стандартно для каждой версии Android и вызывает доверие у пользователя, потому что управляется системой. Он также корректно обрабатывает ошибки: если датчик временно недоступен или палец не распознан, можно показать fallback-кнопку для ввода пароля.


Добавление зависимости

Библиотека Biometric входит в AndroidX и добавляется одной строкой в build.gradle.kts уровня модуля app. На момент написания статьи актуальна версия 1.4.0.

dependencies {
    implementation("androidx.biometric:biometric:1.4.0")
}

После синхронизации Gradle можно сразу приступать к написанию кода.


Настройка и запуск BiometricPrompt

Для работы с биометрией нужен экземпляр BiometricPrompt, который создаётся через конструктор и принимает три параметра: Activity (или Fragment), executor для выполнения колбэков в главном потоке и объект обратного вызова с тремя методами. Затем создаётся PromptInfo — описание того, что будет показано в диалоге: заголовок, подзаголовок и текст на кнопке отказа.

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val btnAuth = findViewById<Button>(R.id.btnAuth)
        btnAuth.setOnClickListener { showBiometricPrompt() }
    }

    private fun showBiometricPrompt() {
        val promptInfo = BiometricPrompt.PromptInfo.Builder()
            .setTitle("Вход в приложение")
            .setSubtitle("Приложите палец к сканеру")
            .setNegativeButtonText("Отмена")
            .build()

        val biometricPrompt = BiometricPrompt(this, ContextCompat.getMainExecutor(this),
            object : BiometricPrompt.AuthenticationCallback() {
                override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult) {
                    Toast.makeText(this@MainActivity, "Доступ разрешён", Toast.LENGTH_SHORT).show()
                }

                override fun onAuthenticationError(errorCode: Int, errString: CharSequence) {
                    Toast.makeText(this@MainActivity, "Ошибка: $errString", Toast.LENGTH_SHORT).show()
                }

                override fun onAuthenticationFailed() {
                    Toast.makeText(this@MainActivity, "Не распознано", Toast.LENGTH_SHORT).show()
                }
            })

        biometricPrompt.authenticate(promptInfo)
    }
}

Метод authenticate() запускает системный диалог. Пользователь прикладывает палец, и если биометрия совпала, вызывается onAuthenticationSucceeded. Если несколько раз подряд произошла неудача, можно показать кнопку для ввода резервного пароля.


Обработка ошибок и fallback на пароль

В реальном приложении нужно предусмотреть случай, когда биометрия недоступна или пользователь хочет войти иначе. Для этого в onAuthenticationError можно отличить критическую ошибку (например, отсутствие датчика) от временной и показать диалог с вводом пароля.

override fun onAuthenticationError(errorCode: Int, errString: CharSequence) {
    if (errorCode == BiometricPrompt.ERROR_NEGATIVE_BUTTON) return
    if (errorCode == BiometricPrompt.ERROR_NO_BIOMETRICS) {
        // устройство не поддерживает биометрию
        showPasswordFallback()
    }
}

Критическая ошибка означает, что сканер не может быть использован. В этом случае можно предложить ввести PIN-код или обычный пароль.


Проверка доступности биометрии перед запуском

Перед показом диалога стоит убедиться, что на устройстве вообще есть биометрический датчик и зарегистрированы отпечатки. Это делается через BiometricManager.canAuthenticate(). Метод возвращает код, по которому можно понять, готово ли устройство.

val biometricManager = BiometricManager.from(this)
when (biometricManager.canAuthenticate(BiometricManager.Authenticators.BIOMETRIC_STRONG)) {
    BiometricManager.BIOMETRIC_SUCCESS -> showBiometricPrompt()
    BiometricManager.BIOMETRIC_ERROR_NO_HARDWARE -> Toast.makeText(this, "Нет датчика", Toast.LENGTH_SHORT).show()
    BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED -> Toast.makeText(this, "Нет отпечатков", Toast.LENGTH_SHORT).show()
}

Полезные советы

  • Всегда предусматривайте fallback. Датчик может быть недоступен, палец — мокрым, а отпечатки — не зарегистрированными. Пользователь должен иметь альтернативный способ входа.
  • Используйте BIOMETRIC_STRONG. Это гарантирует, что биометрия надёжна и поддерживается системой. Для простых задач можно использовать BIOMETRIC_WEAK, но лучше придерживаться строгого варианта.
  • Не показывайте диалог без проверки. Если датчика нет, BiometricPrompt упадёт с исключением. Всегда предварительно вызывайте canAuthenticate().

Коротко о главном

На занятии в Android Studio с использованием Kotlin вы узнали, как внедрить современный метод аутентификации через отпечаток пальца в ваше приложение. Вы освоили создание BiometricPrompt, обработку успешных операций и ошибок, а также проверку доступности датчика перед запуском. Благодаря этому ваш проект теперь может предложить пользователям быстрый и безопасный способ входа без необходимости вводить пароль. Попробуйте интегрировать эту функцию в экран входа в систему — вы будете удивлены, насколько просто реализовать такую возможность.