In manifest file
<uses-permission android:name="android.permission.USE_BIOMETRIC" /> //this is for SDK_INT >= 28
<uses-feature android:name="android.software.secure_lock_screen"/>//this is for below
In your activity, probably you should use a blank view activity for this
val km = getSystemService(KEYGUARD_SERVICE) as KeyguardManager
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.P) {
val executor = ContextCompat.getMainExecutor(this)
val biometricPrompt = BiometricPrompt(this, executor,
object : BiometricPrompt.AuthenticationCallback() {
override fun onAuthenticationError(errorCode: Int,
errString: CharSequence) {
super.onAuthenticationError(errorCode, errString)
Toast.makeText(applicationContext,
"Authentication error: $errString", Toast.LENGTH_SHORT)
.show()
}
override fun onAuthenticationSucceeded(
result: BiometricPrompt.AuthenticationResult) {
super.onAuthenticationSucceeded(result)
Toast.makeText(applicationContext,
"Authentication succeeded!", Toast.LENGTH_SHORT)
.show()
}
override fun onAuthenticationFailed() {
super.onAuthenticationFailed()
Toast.makeText(applicationContext, "Authentication failed",
Toast.LENGTH_SHORT)
.show()
}
})
promptInfo = BiometricPrompt.PromptInfo.Builder()
.setTitle("Biometric login for my app")
.setSubtitle("Log in using your biometric credential")
.setNegativeButtonText("Use account password")
.build()
biometricPrompt.authenticate(promptInfo)
}else{
@Suppress("DEPRECATION")
//Added in API level 21
//Deprecated in API level 29 as per android doc
val i = km.createConfirmDeviceCredentialIntent("title", "description")
startActivityForResult(i, 1000)
}
Then in on activity result
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode==1000&&resultCode==Activity.RESULT_OK){
//verified open next activity
}
}