Как сделать BiometricPrompt неотменяемым?

Я использую BiometricPrompt в своем приложении. Он работает хорошо и показывает диалог при вызове метода authenticate(). Но это диалоговое окно закрывается, когда я нажимаю за пределами диалогового окна. Как это предотвратить? Как сделать диалог BiometricPrompt неотменяемым? Здесь нет такого метода, как biometricPrompt.setCancelable(false).


person BArtWell    schedule 06.06.2019    source источник
comment
кажется, что эта функция недоступна, я предлагаю использовать пользовательский диалог для той же цели.   -  person MadLeo    schedule 06.06.2019
comment
Вы пробовали setCanceledOnTouchOutside(false)?   -  person Mehul Solanki    schedule 06.06.2019
comment
@MadLeo Из документации: в Android 9 и выше API FingerprintManager устарел. Если ваши связанные и системные приложения используют этот API, обновите их, чтобы вместо этого использовать BiometricPrompt. source.android.com/security/biometric   -  person BArtWell    schedule 06.06.2019
comment
@MehulSolanki Как я вижу, нет доступного метода с таким именем: developer .android.google.cn/reference/kotlin/androidx/biometric/   -  person BArtWell    schedule 06.06.2019
comment
Вы можете обработать это в onAuthenticationError с кодом ошибки BiometricPrompt.ERROR_USER_CANCELED   -  person DAC84    schedule 27.11.2019


Ответы (4)


Вы должны использовать версию 1.0.0-beta01 или более позднюю.

Теперь это поведение по умолчанию:
Прикосновения снаружи больше не отменяют аутентификацию. Кнопка "Назад" все еще отменяет аутентификацию.

Вы можете просмотреть журнал изменений:

Изменено поведение, чтобы запретить отмену BiometricPrompt событием касания за пределами подсказки.

Вы также можете ознакомиться с отчетом о проверке.< br> Нового API нет.

person Gabriele Mariotti    schedule 31.08.2019
comment
FragmentManager уже выполняет ошибку транзакции после обновления до 1.0,1 - person Amar Singh; 01.01.2020
comment
Привет, Габриэле, есть шанс, что ты знаешь, как реализовать что-то вроде прослушивателя onDismiss или onCancel? Интересно, возможно ли это вообще? - person Alex Berdnikov; 14.03.2020
comment
Я пробовал с v1.0.1 и v1.1.0-alpha01. Диалог закрывается, когда я нажимаю снаружи. Любая помощь будет оценена. - person Himanshu; 30.06.2020
comment
голосование против, потому что подсказка отклоняется при нажатии вне подсказки на 1.1.0-rc01 - person Louis; 18.12.2020

BiometricPrompt не позволяет. Таким образом, вы не сможете сделать системную биометрическую подсказку неотменяемой. Но вы можете обнаружить, когда пользователь отменяет диалог.

Таким образом, можно было бы снова показать биометрическую подсказку после того, как пользователь отменил ее (что, я думаю, было бы плохим пользовательским интерфейсом) или использовать альтернативную аутентификацию пользователя:

override fun onAuthenticationError(errorCode: Int, errString: CharSequence) {
        if (errorCode == BiometricConstants.ERROR_USER_CANCELED) {
            // User canceled the operation

            // you can either show the dialog again here

            // or use alternate authentication (e.g. a password) - recommended way
        }
    }
person mgcaguioa    schedule 13.08.2019
comment
Можем ли мы предоставить альтернативную аутентификацию в случае сбоя отпечатка пальца? Как пин-код устройства Android для извлечения пароля из хранилища ключей? - person nibz; 14.08.2019
comment
Да, ты можешь. Вы можете открыть экран пароля/пин-кода/шаблона и подтвердить учетные данные пользовательского устройства. Проверьте этот ответ SO: stackoverflow.com/a/52504424/3955965 - person mgcaguioa; 15.08.2019
comment
Вместо этого вам, вероятно, следует использовать setDeviceCredentialAllowed: developer. android.com/reference/androidx/biometric/ - person Kevin; 21.09.2019

проверить это

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) {
    supportFragmentManager.fragments.forEach {
        if(it is DialogFragment) {
            it.dialog?.setCanceledOnTouchOutside(false)
        }
    }
}
person 黄朝阳    schedule 30.08.2019
comment
Биометрическая подсказка не обязательно является диалоговым окном в зависимости от устройства. Например, на устройствах OnePlus может отображаться полноэкранный режим. - person Louis; 22.12.2020

Есть некоторые устройства, которые все еще имеют эту проблему. Обходной путь будет заключаться в том, чтобы получить корневой вид и добавить вид наложения с интерактивным методом, установленным на false.

    ViewGroup  viewGroup =  ((ViewGroup) yourActivity.findViewById(android.R.id.content)).getChildAt(0);

    //create your view
    Display display = mActivity.getWindowManager().getDefaultDisplay();
    Point size = new Point();
    display.getSize(size);
    View view = new View(yourActivity);
    view.setId(R.id.overlay_view);
    view.setLayoutParams(new ViewGroup.LayoutParams(size.x, size.y));
    view.setBackgroundColor(ContextCompat.getColor(yourActivity, R.color.black));
    view.setOnClickListener(v -> {
        //do nothing prevent click under this overlay
    });

    //add your view on top of the screen
    viewGroup.addView(view);

    //call your biometric dialog
    ....

    //on callbacks even if it is error or success call remove view
    viewGroup.removeView(view);
person Lucian Novac    schedule 09.01.2020