在片段内执行biometricPrompt?.authenticate(promptInfo)时,FragmentManager已经在执行事务

时间:2019-05-01 09:23:03

标签: android biometrics android-biometric-prompt

如果您在活动中创建biometricPrompt和提示符Info,它将正常工作。但是我无法使它在片段中工作。

这是片段的内部,在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)
}

1 个答案:

答案 0 :(得分:1)

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

通过提供第二个构造函数,可以在List posts = []; void getPostsList() async { final fetchedPosts = await NetworkFile().getPosts(); setState(() { posts = fetchedPosts; }); print(posts); } 中解决此问题。在此版本之前,我通过恢复为androidx.biometric:biometric:1.0.0-beta01来解决了该问题,但是现在有一个实际的解决方案。

您可以找到alpha03发行说明here

  

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

您可以找到新的beta01构造函数文档here

BiometricPrompt

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

  1. 将build.gradle更改为使用生物识别版本BiometricPrompt(Fragment fragment, Executor executor, BiometricPrompt.AuthenticationCallback callback)
  2. 使用新的构造函数。简而言之,将第一个参数更改为片段而不是活动。请在下面查看我的代码更改:

    1.0.0-beta01