Возможно, вы неоднократно задавались вопросом, как реализовать вход в приложение через отпечаток пальца или 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. После того, как необходимые зависимости скачаются, запустите проект.
После запуска приложения, вы должны увидеть пустой экран. Это будет отправная точка для добавления остального кода.
Добавление Biometric Library в проект
Добавьте AndroidX Biometric Library в проект. Откройте build.gradle (Module:app) и добавьте AndroidX Biometric Library в раздел dependencies
:
implementation 'androidx.biometric:biometric:1.0.1'
Не забудьте синхронизировать проект как показано ниже:
Работаем с 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()
Давайте разберём, что тут написано:
promptInfo
: Здесь будет хранится ссылка на созданный с помощьюBiometricPrompt.PromptInfo
билдер диалог для аутентификации.setTitle
: Метод для установки заголовка диалогу.setSubtitle
: Метод для установки подзаголовка для диалогаsetDescription
: С помощью этого метода можно добавить описание для чего нужен этот диалог, чтобы пользователь понимал, что происходит.setDeviceCredentialAllowed(true)
: Если устройство не поддерживает аутентификации через отпечаток пальца, то этот метод позволяет использовать пин-код или графический паттерн для входа.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() } })
Рассмотрим, что здесь написано:
- Инициализация переменной
biometricPrompt
имеющей типBiometricPrompt
.BiometricPrompt
принимает 3 параметра: контекст, executor и коллбэки. Код, переданный в коллбэке сработает при успешной аутентификации и также при ошибке. - Когда пользователь успешно войдет, то сработает метод
onAuthenticationSucceeded
который изменит видимость лэйаута сView.GONE
наView.VISIBLE
. - Если во время аутентификации появится ошибка, то сработает метод
onAuthenticationError
. В этом случае пользователю покажетсяToast
, с объяснением ошибки. onAuthenticationFailed
: Этот метод вызывается когда пользователь ввел неверный код или отпечаток пальца не верный.
Наконец, добавьте этот код в конец метода authUser
чтобы показать диалог:
biometricPrompt.authenticate(promptInfo)
Запустите проект. После этого вы увидите экран с диалогом
Ура, мы создали диалог, который может работать с отпечатком пальца. Кроме того, у пользователя есть возможность ввести пароль. В следующей части мы добавим работу с SharedPreference, чтобы хранить данные аккаунта.
Код проекта вы сможете скачать здесь
Понравилась статья? Подписывайся на telegram-канал и группу Вконтакте для получения самых интересных материалов по Android – разработке.
Статья основана на материалах: