Проверьте, включены ли на устройствах биометрические данные, с помощью биометрической подсказки androidx

В Android приглашение БиометрическаяПодсказка заменило устаревшее Менеджер отпечатков пальцев. FingerPrintManager имеет две функции hasEnrolledFingerprints() и isHardwareDetected(), чтобы проверить, поддерживает ли устройство отпечатки пальцев и зарегистрировал ли пользователь аутентификацию по отпечатку пальца.

Кажется, что с новым BiometricPrompt нет функций, чтобы проверить это, не пытаясь запросить BiometricPrompt. Существует BiometricPrompt.AuthenticationCallback.onAuthenticationError(, который вызывается с кодом ошибки, указывающим, поддерживает ли устройство биометрические данные и зарегистрирована ли у пользователя биометрическая аутентификация.

Поэтому я могу получить эту информацию, только если попытаюсь пройти аутентификацию от пользователя. Есть ли способ проверить, не пытаясь запросить аутентификацию, чтобы проверить, поддерживает ли устройство биометрические данные и зарегистрировал ли их пользователь?

Это было недавно добавлено в androidx в beta01 или beta02, я забыл, что

nAndroid 11.10.2019 20:37
6
2
8 089
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Используйте 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?

Stephan 28.05.2019 10:40

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, но, похоже, нет возможности проверить это заранее.

Stephan 28.05.2019 11:04

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

Stephan 28.05.2019 11:14

@EarlOfEgo Это приглашение будет отображаться, если зарегистрирован хотя бы один отпечаток пальца.

Manoj Perumarath 28.05.2019 11:25

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

Stephan 28.05.2019 11:28

@EarlOfEgo у вас может быть обратный вызов, где есть тип ошибки, вот и все, см. обновленный ответ

Manoj Perumarath 28.05.2019 11:46

Если вы используете 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).
Ganesh MB 19.07.2021 14:17

Спасибо за внимание! Я обновил ответ.

James J 20.07.2021 18:09

Ниже приведена последняя реализация в 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
    }

Другие вопросы по теме