Dans Android BiometricPrompt Prompt a remplacé le obsolète FingerprintManager . FingerPrintManager a deux fonctions hasEnrolledFingerprints()
et isHardwareDetected()
pour vérifier si l'appareil prend en charge les empreintes digitales et si l'utilisateur a inscrit une authentification par empreinte digitale.
Avec le nouveau BiometricPrompt, il semble qu'il n'y ait aucune fonction pour vérifier cela sans essayer de demander le BiometricPrompt. Il y a un BiometricPrompt.AuthenticationCallback.onAuthenticationError(
qui est appelé avec un code d'erreur indiquant si l'appareil prend en charge la biométrie et si l'utilisateur dispose d'une authentification biométrique inscrite.
Je ne peux donc obtenir ces informations que si j'essaie de m'authentifier auprès de l'utilisateur. Existe-t-il un moyen de vérifier sans essayer de demander l'authentification pour vérifier si l'appareil prend en charge la biométrie et si l'utilisateur les a inscrits?
FingerPrintManager
ne contient que les données relatives à l'authentification par empreinte digitale, donc il a hasEnrolledFringers()
. Mais BiometricPrompt
est utilisé pour le déverrouillage du visage, l'impression plus fine, l'iris. C'est comme une classe de manager ordinaire. Google a ajouté canAuthenticate
qui prend en charge de Android Q. Mais vous pouvez le vérifier pour une API inférieure en utilisant
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
val hasBiometricFeature :Boolean = context.packageManager.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)
Quoi qu'il en soit, Google l'a également ajouté aux composants androidx androidx.biometric:biometric
implementation 'androidx.biometric:biometric:1.0.0-alpha04'
utilise la permission
<uses-permission Android:name="Android.permission.USE_BIOMETRIC" />
sur `AuthenticationCallback '
public void onAuthenticationError(int errorCode, CharSequence errString) {}
vous pouvez vérifier les codes d'erreur avec ceux
/**
* The user does not have any biometrics enrolled.
*/
int BIOMETRIC_ERROR_NO_BIOMETRICS = 11;
Si vous utilisez compileSdkVersion 29 et buildToolsVersion "29.0.1". Vous pouvez utiliser une méthode de vérification native.
J'ai écrit cette fonction pour Kotlin:
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
}
De plus, vous devez implémenter sur votre fichier gradle d'application comme dépendance:
implementation 'androidx.biometric:biometric:1.0.0-alpha04'
et utilisez également les outils de construction les plus récents:
compileSdkVersion 29
buildToolsVersion "29.0.1"
Cela a été ajouté récemment à l'androx en beta01 ou beta02, j'oublie lequel
Utilisez BiometricManager
il a une méthode
canAuthenticate()
il revient
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
Consultez la documentation officielle https://developer.Android.com/reference/Android/hardware/biometrics/BiometricManager.html