Я пишу функцию приложения для аутентификации пользователя с помощью биометрического API аутентификации по отпечатку пальца. . И он работал, как и ожидалось, с использованием API BiometricPrompt.
Как правило, он отображает собственное диалоговое окно пользовательского интерфейса, поэтому его можно унифицировать на всех устройствах Android. Диспетчер отпечатков пальцев API)
В одном из сценариев тестирования устройств я обнаружил in-display (на экран, например устройство Oneplus 6T) поддержка отпечатков пальцев вместо задней биометрической аппаратной опции.
Когда я запускаю на нем приложение, при вызове biometricPrompt.authenticate(..)
вместо диалога отображается опция аутентификации по отпечатку пальца на дисплее. Это нормально и управляется внутренним API BiometricPrompt.
Но это создает некоторую несогласованность для разработчика.
- Когда он предоставляет встроенный диалог аутентификации, все резервные ошибки отображаются в самом диалоге.
- Но в случае проверки подлинности на дисплее я не нашел способа, которым ему удается отображать сообщение об ошибке. И я должен обрабатывать этот запасной вариант и отображать его по-своему.
Теперь вопрос
- Есть ли способ управлять/отображать сообщение с помощью компонента представления проверки подлинности на дисплее.
- Как определить, поддерживает ли устройство встроенную биометрическую аутентификацию.
Изменить: я использую ссылку на код:
import android.content.Context
import androidx.biometric.BiometricPrompt
import androidx.fragment.app.FragmentActivity
import java.lang.Exception
import java.util.concurrent.Executors
import javax.crypto.Cipher
class BiometricAuthenticationManager(private val context: Context) :
BiometricPrompt.AuthenticationCallback() {
private var biometricPrompt: BiometricPrompt? = null
override fun onAuthenticationError(errorCode: Int, errString: CharSequence) {
super.onAuthenticationError(errorCode, errString)
biometricPrompt?.cancelAuthentication()
}
override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult) {
super.onAuthenticationSucceeded(result)
}
override fun onAuthenticationFailed() {
super.onAuthenticationFailed()
}
fun init(cipher: Cipher, promptInfo: BiometricPrompt.PromptInfo) {
if (context is FragmentActivity) {
val executor = Executors.newSingleThreadExecutor()
biometricPrompt = BiometricPrompt(context, executor, this)
biometricPrompt?.authenticate(promptInfo, BiometricPrompt.CryptoObject(cipher))
} else {
throw Exception(
"Check for FragmentActivity context.")
}
}
}
Для получения дополнительной информации о том, как это выглядит, пожалуйста, найдите следующее приложение.
Я пытаюсь проверить тот же сценарий для экрана блокировки, где, я думаю, он использует пользовательскую реализацию с использованием класса FingerPrintManager и отображает сообщение.
androidx
версиюBiometricPrompt
и посмотреть, изменит ли она поведение. - person CommonsWare   schedule 14.08.2019