Я пытаюсь выяснить, как изменить (если это возможно) нормальное поведение biometricPrompt, в частности, я хочу отобразить Гэндальф , когда аутентификация не удалась. В настоящее время я показываю его с помощью специального alertDialog, но он остается в фоновом режиме, с фрагментом biometricPrompt на переднем плане , точно таким же, как этот , и он теряет всю свою тупость ... Лучшее решение, вероятно, будетотображать оба параметра, alertDialog и biometricPrompt, на переднем плане, отображая изображение только в верхней половине экрана, но в настоящее время я не знаю, как это сделать, или, что еще лучше, я не знаю, как связать компоновки вместе суправлять размером / полями и всем остальным.
Другая вещь, о которой я думал, это удалить biometricPrompt, чтобы диалоговое окно с предупреждением было выведено на передний план, но любое решение, которое я пробовал, с треском провалилось.
Любой вид помощи / идей будет приветствоваться.
В любом случае, вот код:
class BiometricPromptManager(private val activity: FragmentActivity) {
private val cryptoManager = CryptoManager(activity)
fun authenticateAndDecrypt(failedAction: () -> Unit, successAction: (String) -> Unit) {
// display biometric prompt, if the user is authenticated, the decryption will start
// if biometric related decryption gives positives results, the successAction will start services data decryption
val executor = Executors.newSingleThreadExecutor()
val biometricPrompt = BiometricPrompt(activity, executor, object : BiometricPrompt.AuthenticationCallback() {
override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult) {
super.onAuthenticationSucceeded(result)
cryptoManager.startDecrypt(failedAction,successAction)
}
override fun onAuthenticationError(errorCode: Int, errString: CharSequence) {
super.onAuthenticationError(errorCode, errString)
activity.runOnUiThread { failedAction() }
}
override fun onAuthenticationFailed() {
super.onAuthenticationFailed()
activity.runOnUiThread { failedAction() }
}
})
val promptInfo = biometricPromptInfo()
biometricPrompt.authenticate(promptInfo)
}
private fun biometricPromptInfo(): BiometricPrompt.PromptInfo {
return BiometricPrompt.PromptInfo.Builder()
.setTitle("Fingerprint Authenticator")
.setNegativeButtonText(activity.getString(android.R.string.cancel))
.build()
}
}
Открыть биометрическую аутентификацию из действия:
private fun openBiometricAuth(){
if(sharedPreferences.getBoolean("fingerPrintEnabled",false)) {
if (BiometricManager.from(this).canAuthenticate() == BiometricManager.BIOMETRIC_SUCCESS) { // check for hardware/permission
biometric.visibility = View.VISIBLE
BiometricPromptManager(this).authenticateAndDecrypt(::failure, ::callDecryption)
}
}
}
Чтоделать, когда пользователь не распознается:
private fun failure(){
val view = layoutInflater.inflate(R.layout.gandalf, null)
val builder = AlertDialog.Builder(this)
builder.setView(view)
builder.setPositiveButton("Dismiss") { dialog: DialogInterface, id: Int -> dialog.cancel() }
val alertDialog = builder.create()
alertDialog.show()
}