Question: I'm asked to show certain UI elements depending on the presence of biometric hardware. For Android 23-27 I use `FingerprintManager#isHardwareDetected()` and `FingerprintManager#hasEnrolledFingerprints()`. Both of which are deprecated in Android 28.

I understand that I can get this information by using `BiometricPrompt#authenticate(...)` and receiving either `BiometricPrompt#BIOMETRIC_ERROR_HW_NOT_PRESENT` or `BiometricPrompt#BIOMETRIC_ERROR_NO_BIOMETRICS` in the `BiometricPrompt.AuthenticationCallback#onAuthenticationError(int errorCode, ...)` method. But this would lead to the `BiometricPrompt` being shown on supporting devices, which is undesirable. Using the `CancellationSignal` doesn't seem to be a solution either, since I wouldn't know when to cancel the prompt.

Is there any way to detect biometric hardware presence and user enrolment?

Answer: 
I wrote this method for 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
}

```

Additional, you have to implement on you app gradle file as dependecy:

```
implementation 'androidx.biometric:biometric:1.0.0-alpha04'

```

and also use the newest build tools:

```
compileSdkVersion 29
buildToolsVersion "29.0.1"

```
In my biometrics, I used these and a few more checks to make sure that the device was capable and the fingerprint was enabled. In Kotlin I created an Object class and called it utilities.

```
object BiometricUtilities {
    fun isBiometricPromptEnabled(): Boolean {
        return Build.VERSION.SDK_INT >= Build.VERSION_CODES.P
    }
    fun isSdkVersionSupported(): Boolean {
    return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
    }
    fun isHardwareSupported(context: Context): Boolean {
        val fingerprintManager = FingerprintManagerCompat.from(context)
        return fingerprintManager.isHardwareDetected
    }
    fun isFingerprintAvailable(context: Context): Boolean {
        val fingerprintManager = FingerprintManagerCompat.from(context)
        return fingerprintManager.hasEnrolledFingerprints()
    }
}

```

Then in my bioManager class, I placed the conditional statements under a function called authenticate that implements BiometricCallback

```
fun authenticate(biometricCallback: BiometricCallback) {

    if (!BiometricUtilities.isHardwareSupported(context)) {
        biometricCallback.onBiometricAuthenticationNotSupported()
        return
    }

    if (!BiometricUtilities.isFingerprintAvailable(context)) {
        val intent = Intent(Settings.ACTION_SECURITY_SETTINGS)
           biometricCallback.onBiometricAuthenticationNotAvailable()
        return
    }

    displayBiometricDialog(biometricCallback)
}

```

This way you can check for availability of hardware and presence of fingerprint on the device and let the OS help you to display a prompt or not