Как установить резервный метод, если отпечаток пальца не работает

Недавно я переместил свой проект на AndroidX и, внедряя отпечаток пальца для приложения, использую Biometric для AndroidX.

implementation 'androidx.biometric:biometric:1.0.0-alpha03'

Когда отображается диалоговое окно для использования отпечатка пальца для аутентификации, в диалоговом окне есть опция «Отмена», установленная в качестве отрицательной кнопки.

 final BiometricPrompt.PromptInfo promptInfo = new BiometricPrompt.PromptInfo.Builder()
            .setTitle("Log into App")
            .setSubtitle("Please touch the fingerprint sensor to log you in")
            .setDescription("Touch Sensor")
            .setNegativeButtonText("Cancel".toUpperCase())
            .build();

Согласно документации Android: https://developer.android.com/reference/androidx/biometric/BiometricPrompt.PromptInfo.Builder.html#setNegativeButtonText(java.lang.CharSequence)

Required: Set the text for the negative button. 
This would typically be used as a "Cancel" button, but may be also used
to show an alternative method for authentication, 
such as screen that asks for a backup password.

Поэтому вместо кнопки «Отмена» я могу сказать «Использовать пароль», чтобы предоставить альтернативный метод в случае сбоя отпечатка пальца, и когда пользователь нажимает на него, я могу показать другое всплывающее диалоговое окно, в котором я могу позволить пользователю ввести пароль устройства, чтобы помочь получить пароль приложения. из хранилища ключей. Это верно ?

Но что произойдет, если у меня не установлен пароль для разблокировки телефона, а я использую графический ключ?

Я вижу, что если я использую android.hardware.biometrics.BiometricPrompt.Builder вместо androidx.biometric.BiometricPrompt.PromptInfo.Builder, у него будет метод https://developer.android.com/reference/android/оборудование/биометрия/BiometricPrompt.Builder.html#setDeviceCredentialAllowed(boolean) с той же целью, чтобы пользователь мог аутентифицироваться другими способами в случае сбоя отпечатка пальца.

Может кто-нибудь помочь мне понять это? Как я могу добиться этого с помощью AndroidX, поскольку мое приложение совместимо с API 16 и далее. И почему AndroidX не использует этот резервный метод?


comment
Я использую alpha04, но setDeviceCredentialAllowed () недоступен. Я думал, что вся идея использования компонентов AndroidX заключается в том, чтобы избежать использования кода уровня SDK ... Может быть, Google планирует добавить это в будущем?   -  person Takeshi Kaga    schedule 25.07.2019


Ответы (4)


API setDeviceCredentialAllowed недавно был добавлен в beta01

См. Примечания к выпуску здесь

https://developer.android.com/jetpack/androidx/releases/biometric

person Kevin    schedule 14.09.2019
comment
Больше не доступно. Какое новое решение? - person TimBigDev; 15.12.2020

В SDK версии Q и выше используется BiometricPrompt с обратным вызовом аутентификации, иначе используется createConfirmDeviceCredentialsIntent.

val km = getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
    val biometricPrompt = BiometricPrompt.Builder(this)
            .setTitle(getString(R.string.screen_lock_title))
            .setDescription(getString(R.string.screen_lock_desc))
            .setDeviceCredentialAllowed(true)
            .build()

    val cancellationSignal = CancellationSignal()
    cancellationSignal.setOnCancelListener {
        println("@Biometric cancellationSignal.setOnCancelListener")
        //handle cancellation
    }

    val executors = mainExecutor
    val authCallBack = object : BiometricPrompt.AuthenticationCallback() {
        override fun onAuthenticationError(errorCode: Int, errString: CharSequence?) {
            super.onAuthenticationError(errorCode, errString)
            print("SecuritySetupActivity.onAuthenticationError ")
            println("@Biometric errorCode = [${errorCode}], errString = [${errString}]")
            //handle authentication error
        }

        override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult?) {
            super.onAuthenticationSucceeded(result)
            print("SecuritySetupActivity.onAuthenticationSucceeded ")
            println("@Biometric result = [${result}]")

            //handle authentication success
        }

        override fun onAuthenticationHelp(helpCode: Int, helpString: CharSequence?) {
            super.onAuthenticationHelp(helpCode, helpString)
            print("SecuritySetupActivity.onAuthenticationHelp ")
            println("@Biometric helpCode = [${helpCode}], helpString = [${helpString}]")
        }

        override fun onAuthenticationFailed() {
            super.onAuthenticationFailed()
            print("SecuritySetupActivity.onAuthenticationFailed ")

            //handle authentication failed
        }
    }



    biometricPrompt.authenticate(cancellationSignal, executors, authCallBack)


} else {
    val i = km.createConfirmDeviceCredentialIntent(getString(R.string.screen_lock_title), getString(R.string.screen_lock_desc))
    startActivityForResult(i, 100)
}
person Shashank Pednekar    schedule 16.09.2019

Попробуйте setDeviceCredentialAllowed (true) в BiometricPromopt.

person Irfan    schedule 06.09.2019

androidx 1.0.0 позволяет с легкостью настроить откат, например:

// Allows user to authenticate using a PIN, pattern, or password.
val promptInfo = BiometricPrompt.PromptInfo.Builder()
    .setTitle("Biometric login for my app")
    .setSubtitle("Log in using your biometric credential")
    .setNegativeButtonText("Cancel")
    .setDeviceCredentialAllowed(true)
    .build()

см. это

person gor    schedule 13.11.2019
comment
Внимание! Вы не можете вызывать setDeviceCredentialAllowed () и setNegativeButtonText () для одного и того же экземпляра BiometricPrompt. - person solidogen; 01.07.2020