Некоторые вопросы о BiometricPrompt на Android - PullRequest
0 голосов
/ 21 ноября 2019

Я пытаюсь выяснить, как изменить (если это возможно) нормальное поведение 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()
}

1 Ответ

0 голосов
/ 19 декабря 2019

Сам биометрический API обрабатывает неудачные попытки аутентификации следующим образом:

  1. Для каждой неудачной попытки вызывается обратный вызов onAuthenticationFailed().
  2. Пользователь получает 5 попыток после5-ая попытка завершается неудачно, обратный вызов onAuthenticationError() получает код ошибки ERROR_LOCKOUT, и пользователь должен ждать 30 секунд, чтобы повторить попытку.

Отображение вашего диалога внутри onAuthenticationFailed() может быть слишком нетерпеливым и можетпривести к плохому пользовательскому опыту. И поэтому хорошее место может быть после того, как вы получите ERROR_LOCKOUT. Биометрическая библиотека AndroidX работает так, что при отправке ошибки она отклоняет BiometricPrompt. Поэтому у вас не должно возникнуть проблем с отображением собственного диалога в этот момент.

В любом случае, т. Е. Помимо этих мнений, более общий подход заключается в том, чтобы позвонить cancelAuthentication(), чтобы отклонить запрос, а затем перейти к показу своего собственного диалога таким образом.

Также, пожалуйста,следуйте blogpost1 и blogpost2 для рекомендуемого шаблона проектирования для BiometricPrompt.

...