9

如果您在活动中创建 biometricPrompt 和 promptInfo,它工作正常。但我无法让它在片段中工作。

这是一个片段内部,它在 OnViewCreated 内部被调用。您在活动中执行相同的操作效果很好,一种解决方案是从活动中传递 biometricPrompt 和 PromptInfo 并将其传递到片段中。

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    tryToDisplayBiometricPrompt()
}


@TargetApi(Build.VERSION_CODES.M)
private fun tryToDisplayBiometricPrompt() {
    //Create a thread pool with a single thread
    biometricPrompt = BiometricPrompt(activity as FragmentActivity, Executors.newSingleThreadExecutor(), object : BiometricPrompt.AuthenticationCallback() {
        override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult) {
            super.onAuthenticationSucceeded(result)
            authenticationSuccessful()
        }

        override fun onAuthenticationError(errorCode: Int, errString: CharSequence) {
            super.onAuthenticationError(errorCode, errString)
            if (errorCode == BiometricConstants.ERROR_NEGATIVE_BUTTON || errorCode == BiometricConstants.ERROR_USER_CANCELED || errorCode == BiometricPrompt.ERROR_CANCELED) return
            authenticationlistener?.isBiometricAvailable = false
            authenticationlistener?.onAuthenticationFailed()
        }
    })

    promptInfo = BiometricPrompt.PromptInfo.Builder()
            .setTitle(getString(R.string.biometric_title))
            .setSubtitle(getString(R.string.biometric_subtitle))
            .setDescription(getString(R.string.biometric_description))
            .setNegativeButtonText(getString(R.string.cancel))
            .build()

    biometricPrompt?.authenticate(promptInfo)
}
4

1 回答 1

7

请参阅下面或相同的答案here

androidx.biometric:biometric:1.0.0-beta01通过提供第二个构造函数来解决问题。在此版本之前,我通过恢复来解决了这个问题,alpha03但现在有一个实际的解决方案可用。

您可以在此处beta01找到发行说明

我们为 BiometricPrompt 引入了第二个构造函数,它允许它托管在 Fragment 中(与现有的构造函数相反,它需要 FragmentActivity)。

您可以在此处BiometricPrompt找到新的构造函数文档

BiometricPrompt(Fragment fragment, Executor executor, BiometricPrompt.AuthenticationCallback callback)

要修复,请按照以下简单步骤操作:

  1. 更改您的 build.gradle 以使用生物识别版本1.0.0-beta01
  2. 使用新的构造函数。简而言之,将第一个参数更改为您的片段而不是活动。请参阅下面的代码更改:

    val biometricPrompt = BiometricPrompt(activity!!, executor, callback)
    // Change the above line to the below line
    val biometricPrompt = BiometricPrompt(this, executor, callback)
    
于 2019-09-04T16:01:38.057 回答