Пароли запоминать неудобно, а вводить их каждый раз — долго. Современные смартфоны предлагают более быстрый и безопасный способ подтверждения личности — отпечаток пальца или сканирование лица. В 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, обработку успешных операций и ошибок, а также проверку доступности датчика перед запуском. Благодаря этому ваш проект теперь может предложить пользователям быстрый и безопасный способ входа без необходимости вводить пароль. Попробуйте интегрировать эту функцию в экран входа в систему — вы будете удивлены, насколько просто реализовать такую возможность.