android - Android Biometrics - 选择哪种方法(回退到密码)?
问题描述
我有一个具有 PIN/锁定屏幕的应用程序。为了打开应用程序,用户需要输入他的 PIN 码(他之前在应用程序中设置过)。
我想添加生物识别选项 -> 而不是输入 PIN 只需放置您的指纹。但是,您仍然应该可以选择使用 PIN 作为后备。与 Revolut、LastPass 或许多其他银行应用程序完全相同。很简单,对吧?
我查看了新的生物识别 API,它不支持回退到自定义 pin/密码(仅回退到锁定屏幕)。我可以以某种方式手动添加(当用户取消对话框时),但这会产生糟糕的用户体验(从 Google 样式对话框切换到应用程序样式屏幕)。此外,谷歌对话框有一个透明的背景(可能会泄露敏感信息),所以我需要把它放在一个单独的空白活动中(同样糟糕的体验)。我想知道银行应用程序如何计划迁移到那里?
我应该用旧方法(FingerprintManager)吗?回退到设备锁定是否足够安全?如果有人知道您的手机 PIN,他就可以访问您的所有应用程序。
解决方案
你看过这篇博文吗?还是那个?AndroidX 生物识别库提供了一个名为的方法setNegativeButtonText()
,如果用户不想使用生物识别,该方法提供了使用帐户/应用程序凭据的选项。
然后在回调中你会做
override fun onAuthenticationError(errorCode: Int, errString: CharSequence) {
super.onAuthenticationError(errorCode, errString)
Log.d(TAG, "$errorCode :: $errString")
if(errorCode == BiometricPrompt.ERROR_NEGATIVE_BUTTON) {
loginWithAppAccountCredentials() // Because negative button says use application/account password
}
}
此外,当您的用户单击 UI 中的登录按钮时,您的 onClick 可能如下所示:
override fun onClick(view: View) {
val promptInfo = createPromptInfo()
if (BiometricManager.from(context)
.canAuthenticate() == BiometricManager.BIOMETRIC_SUCCESS) {
biometricPrompt.authenticate(promptInfo, cryptoObject)
} else {
loginWithAppAccountCredentials()
}
}
推荐阅读
- javascript - 向下滚动时无限滚动不起作用
- spring - 在 Hibernate 中使用 GeneratedValue 和 GenericGenerator 自定义注释
- azure - 有没有办法在 YML 中使用 Azure Artifacts 触发管道?
- c++11 - 模板方法中可调用对象的最佳类型是什么?
- amazon-web-services - 将 PutRecords 直接发布到 kinesis API,无需(真实)身份验证
- sql-server - Postgresql - 从 CTE 输出更新 CTE 结果?
- reactjs - 尝试在 React Native 中呈现数据的空数组
- assembly - 16 字节宽的 VTBL 是否有 Armv8-A 内在函数?
- mongodb - Mongodb嵌套if条件以获取计数
- javascript - 使用 .includes(ARRAY 的值)获取地图