如何在 Android 中实现生物识别 API?

How can I implement Biometric API in Android?

我想对我的应用程序中的 lock/unlock 图片使用生物识别或密码。 Biometric API 可以检测生物特征,但 "use password" 选项采用设备的 pin/password。我希望用户在应用程序内输入密码以及他想要的任何密码。

我使用了否定按钮。我将否定按钮的文本设置为"Use Password",并在onAuthenticationError回调方法中处理了否定按钮onclick。

if (errorCode == BiometricPrompt.ERROR_NEGATIVE_BUTTON) {
    //show the in app password dialog
}

在您的应用中同时使用生物识别和密码是一种常见的模式。本质上,这个想法是在支持它的设备上使用生物识别,否则使用 Account/app 密码,如下所示:

override fun onClick(view: View) {  // user clicks a button in your app to authenticate
   val promptInfo = createPromptInfo()
   if (BiometricManager.from(context)
               .canAuthenticate() == BiometricManager.BIOMETRIC_SUCCESS) {
       biometricPrompt.authenticate(promptInfo, cryptoObject)
   } else {
       loginWithPassword()
   }
}

此外,在创建您的 PromptInfo 时,您将执行 .setNegativeButtonText(getString(R.string.prompt_info_use_app_password)) 然后在 onAuthenticationError() 回调中您将执行

override fun onAuthenticationError(errorCode: Int, errString: CharSequence) {
   super.onAuthenticationError(errorCode, errString)
   Log.d(TAG, "$errorCode :: $errString")
   if(errorCode == BiometricPrompt.ERROR_NEGATIVE_BUTTON) {
       loginWithPassword() // Because negative button says use account/app password
   }
}

注意 cryptoObject 的使用。那是因为密码或生物识别身份验证本身不会加密您的数据。因此,如果您真的希望您的数据(在本例中是您的照片)保密,则必须对其进行加密。

然后最后在 onAuthenticationSucceeded() 回调中你会显示你的数据

   override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult) {
       super.onAuthenticationSucceeded(result)
       Log.d(TAG, "Authentication was successful")
       // Proceed with viewing the private encrypted data.
       showEncryptedData(result.cryptoObject)
   }

免责声明:我为 Android/Google 工作,特别是在生物识别方面。我可以回答您的后续问题