В Android приглашение БиометрическаяПодсказка заменило устаревшее Менеджер отпечатков пальцев.
FingerPrintManager имеет две функции hasEnrolledFingerprints()
и isHardwareDetected()
, чтобы проверить, поддерживает ли устройство отпечатки пальцев и зарегистрировал ли пользователь аутентификацию по отпечатку пальца.
Кажется, что с новым BiometricPrompt нет функций, чтобы проверить это, не пытаясь запросить BiometricPrompt. Существует BiometricPrompt.AuthenticationCallback.onAuthenticationError(
, который вызывается с кодом ошибки, указывающим, поддерживает ли устройство биометрические данные и зарегистрирована ли у пользователя биометрическая аутентификация.
Поэтому я могу получить эту информацию, только если попытаюсь пройти аутентификацию от пользователя. Есть ли способ проверить, не пытаясь запросить аутентификацию, чтобы проверить, поддерживает ли устройство биометрические данные и зарегистрировал ли их пользователь?
Это было недавно добавлено в androidx в beta01 или beta02, я забыл, что
Используйте BiometricManager
у него есть метод
canAuthenticate()
он возвращается
BIOMETRIC_ERROR_NONE_ENROLLED if the user does not have any enrolled
BIOMETRIC_ERROR_HW_UNAVAILABLE if none are currently supported/enabled
BIOMETRIC_SUCCESS if a biometric can currently be used (enrolled and available)
BIOMETRIC_ERROR_NO_HARDWARE
Ознакомьтесь с официальной документацией https://developer.android.com/reference/android/hardware/biometrics/BiometricManager.html
Это было добавлено в Android Q, есть ли способ проверить версии pre Q, лучше всего с версией androidx?
FingerPrintManager
содержит данные только об аутентификации по отпечатку пальца, следовательно, имеет hasEnrolledFringers()
. Но BiometricPrompt
используется для разблокировки лица, мелкого шрифта, диафрагмы. Это как обычный класс менеджера.
Google добавил canAuthenticate
, который поддерживает Android Q.
Но вы можете проверить его на более низкий API, используя
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
val hasBiometricFeature :Boolean = context.packageManager.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)
Во всяком случае, Google также добавил его в компоненты androidx androidx.biometric:biometric
implementation 'androidx.biometric:biometric:1.0.0-alpha04'
использует разрешение
<uses-permission android:name = "android.permission.USE_BIOMETRIC" />
на `AuthenticationCallback'
public void onAuthenticationError(int errorCode, CharSequence errString) {}
Вы можете проверить коды ошибок с помощью тех,
/**
* The user does not have any biometrics enrolled.
*/
int BIOMETRIC_ERROR_NO_BIOMETRICS = 11;
Я использую androidx.biometric:biometric:1.0.0-alpha04
, но, похоже, нет возможности проверить это заранее.
да, это работает для проверки наличия на устройстве считывателя отпечатков пальцев, но не для проверки того, зарегистрировал ли пользователь отпечаток пальца.
@EarlOfEgo Это приглашение будет отображаться, если зарегистрирован хотя бы один отпечаток пальца.
Да, это правильно, но мой вопрос состоял в том, чтобы проверить это, не показывая подсказку.
@EarlOfEgo у вас может быть обратный вызов, где есть тип ошибки, вот и все, см. обновленный ответ
Если вы используете compileSdkVersion 29 и buildToolsVersion «29.0.1». Вы можете использовать собственный метод проверки.
Я написал эту функцию для Котлина:
fun checkForBiometrics() : Boolean {
Log.d(TAG, "checkForBiometrics started")
var canAuthenticate = true
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (Build.VERSION.SDK_INT < 29) {
val keyguardManager : KeyguardManager = applicationContext.getSystemService(KEYGUARD_SERVICE) as KeyguardManager
val packageManager : PackageManager = applicationContext.packageManager
if (!packageManager.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)) {
Log.w(TAG, "checkForBiometrics, Fingerprint Sensor not supported")
canAuthenticate = false
}
if (!keyguardManager.isKeyguardSecure) {
Log.w(TAG, "checkForBiometrics, Lock screen security not enabled in Settings")
canAuthenticate = false
}
} else {
val biometricManager : BiometricManager = this.getSystemService(BiometricManager::class.java)
if (biometricManager.canAuthenticate() != BiometricManager.BIOMETRIC_SUCCESS){
Log.w(TAG, "checkForBiometrics, biometrics not supported")
canAuthenticate = false
}
}
}else{
canAuthenticate = false
}
Log.d(TAG, "checkForBiometrics ended, canAuthenticate=$canAuthenticate ")
return canAuthenticate
}
Кроме того, вы должны реализовать файл gradle вашего приложения как зависимость:
implementation 'androidx.biometric:biometric:1.0.0-alpha04'
а также использовать новейшие инструменты сборки:
compileSdkVersion 29
buildToolsVersion "29.0.1"
В AndroidX биометрический beta01 добавлен BiometricManager.canAuthenticate(int)
(ранее BiometricManager.canAuthenticate()
)
Используйте следующую строку зависимости в файле build.gradle вашего модуля приложения.
implementation 'androidx.biometric:biometric:1.1.0'
Затем вы можете сделать следующее, чтобы проверить, готовы ли какие-либо биометрические данные для использования на устройстве.
BiometricManager.from(context).canAuthenticate(int) == BiometricManager.BIOMETRIC_SUCCESS
В Android 6–9 поддерживаются только отпечатки пальцев. На 10 и выше он будет поддерживать любую биометрию (например, лицо, радужную оболочку).
canAuthenticate()
устарел. Вместо этого используйте canAuthenticate(int)
.
Спасибо за внимание! Я обновил ответ.
Ниже приведена последняя реализация в Kotlin с биометрической аутентификацией на сегодняшний день:
Шаг 1: добавьте следующую зависимость в build.gradle
implementation "androidx.biometric:biometric:1.1.0"
Шаг 2. Добавьте следующее разрешение в AndroidManifest.xml.
<uses-permission android:name = "android.permission.USE_BIOMETRIC" />
Шаг 3: Добавьте следующий метод, чтобы проверить, включена ли биометрия:
/**
* To check if the devices supports biometric authentication
*/
fun isBioMetricEnabled(ctx: Context) : Boolean {
val biometricManager = BiometricManager.from(ctx)
return biometricManager.canAuthenticate(BiometricManager.Authenticators.BIOMETRIC_WEAK) ==
BiometricManager.BIOMETRIC_SUCCESS
}
Для полной реализации биометрической аутентификации см.:
Android BiometricPrompt.Builder.authenticate() не показывает никакого диалога
/**
* Check For Biometrics Support
* --> Fingerprint don't support in this device
* --> Fingerprint not enable in this device
*/
fun checkForBiometricsSupport(context: Context): Boolean {
val status = BiometricManager.from(context).canAuthenticate(BiometricManager.Authenticators.BIOMETRIC_WEAK)
return status == BiometricManager.BIOMETRIC_SUCCESS
}
Возможный дубликат Определите, присутствует ли биометрическое оборудование и зарегистрировал ли пользователь биометрические данные на Android P.