Проверьте, если устройства включены биометрические с помощью Android androidx Биометрическая подсказка
В Android BiometricPrompt приглашение заменило устаревший FingerprintManager. FingerPrintManager имеет две функции hasEnrolledFingerprints()
а также isHardwareDetected()
проверить, поддерживает ли устройство отпечатки пальцев и зарегистрировал ли пользователь какую-либо аутентификацию по отпечатку пальца.
С новым BiometricPrompt кажется, что нет никаких функций, чтобы проверить это, не пытаясь вызвать BiometricPrompt. E сть BiometricPrompt.AuthenticationCallback.onAuthenticationError(
он вызывается с кодом ошибки, указывающим, поддерживает ли устройство биометрическую информацию и имеет ли пользователь зарегистрированную биометрическую аутентификацию.
Так что я могу получить эту информацию, только если я попытаюсь пройти аутентификацию от пользователя. Есть ли способ проверить без попытки аутентификации проверить, поддерживает ли устройство биометрические данные и зарегистрировал ли их пользователь?
7 ответов
Добавлен AndroidX Biometric beta01 BiometricManager.canAuthenticate()
Используйте следующую строку зависимости в файле build.gradle вашего модуля приложения.
implementation 'androidx.biometric:biometric:1.0.0-beta01'
Затем вы можете сделать следующее, чтобы проверить, готовы ли какие-либо биометрические данные к использованию на устройстве.
BiometricManager.from(context).canAuthenticate() == BiometricManager.BIOMETRIC_SUCCESS
На Android 6–9 поддерживаются только отпечатки пальцев. На 10 и выше он поддерживает любые биометрические данные (например, лицо, радужную оболочку глаза).
Если вы используете 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"
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 также добавил его в компоненты Android 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;
/**
* 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
}
Использование 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
Это было недавно добавлено к androidx one в beta01 или beta02, я забыл, какой
Ниже приведена последняя реализация в 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() не показывает никакого диалога