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

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

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

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


person Stephan    schedule 28.05.2019    source источник


Ответы (5)


AndroidX Biometric beta01 добавлен _ 1_ (ранее _ 2_)

Используйте следующую строку зависимости в файле build.gradle вашего модуля приложения.

implementation 'androidx.biometric:biometric:1.1.0'

Затем вы можете сделать следующее, чтобы проверить, готовы ли какие-либо биометрические данные к использованию на устройстве.

BiometricManager.from(context).canAuthenticate(int) == BiometricManager.BIOMETRIC_SUCCESS

На Android 6–9 поддерживаются только отпечатки пальцев. От 10 и выше он поддерживает любые биометрические данные (например, лицо, радужную оболочку глаза).

person James J    schedule 09.09.2019
comment
canAuthenticate() устарел. Используйте вместо этого canAuthenticate(int). - person Ganesh MB; 19.07.2021
comment
Спасибо за внимание! Я обновил ответ. - person James J; 20.07.2021

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;
person Manoj Perumarath    schedule 28.05.2019
comment
Я использую androidx.biometric:biometric:1.0.0-alpha04, но, похоже, заранее проверить нет возможности. - person Stephan; 28.05.2019
comment
да, это работает для проверки наличия на устройстве считывателя отпечатков пальцев, но не для проверки того, зарегистрировал ли пользователь отпечаток пальца. - person Stephan; 28.05.2019
comment
@EarlOfEgo Это приглашение будет отображаться, если зарегистрирован хотя бы один отпечаток пальца - person Manoj Perumarath; 28.05.2019
comment
Да, это правильно, но мой вопрос состоял в том, чтобы проверить это, не показывая подсказку. - person Stephan; 28.05.2019
comment
@EarlOfEgo у вас может быть обратный вызов, где есть тип ошибки, вот и все, см. Обновленный ответ - person Manoj Perumarath; 28.05.2019

Если вы используете 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"
person markomoreno    schedule 21.08.2019

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

person shb    schedule 28.05.2019
comment
Это было добавлено в Android Q, есть ли способ проверить версии до Q, лучше всего с версией androidx? - person Stephan; 28.05.2019

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

person nAndroid    schedule 11.10.2019