2

我正在使用 BiometricPrompt fromandroidx.biometric:biometric:1.0.0-beta02进行身份验证过程。但我面临非常奇怪的问题。

我第一次调用biometricsPromt.authenticate()一切正常,库根据设置的安全方法(模式、指纹、密码等)向我显示屏幕,然后调用回调,一切都很好。

问题是当我biometricsPromt.authenticate()第二次打电话时我得到了错误:

E/DeviceCredentialHandler: onCreate: 执行器和/或回调为空!

我当然要传递执行程序和回调->它们不为空

有没有人面临同样的问题或知道可能是什么问题?

这就是我创建 BiometricPromt 的方式

`

companion object {
        private val executor: Executor by lazy {
            Executors.newSingleThreadExecutor()
        }

        fun showBiometricsPrompt(
            activity: FragmentActivity,
            callback: BiometricPrompt.AuthenticationCallback
        ): BiometricPrompt {
            val promptInfo = BiometricPrompt.PromptInfo.Builder()
                .setTitle(activity.getString(R.string.title_authentication))
                .setDescription(activity.getString(R.string.msg_authenticate_first))
                .setDeviceCredentialAllowed(true)
                .build()

            val biometricPrompt =
                BiometricPrompt(
                    activity,
                    executor, callback
                )
            biometricPrompt.authenticate(promptInfo)
            return biometricPrompt
        }

`

这就是我所说的:

`

BiometricsHelper.showBiometricsPrompt(
                this,
                object : BiometricPrompt.AuthenticationCallback() {
                    override fun onAuthenticationError(errorCode: Int, errString: CharSequence) {
                        super.onAuthenticationError(errorCode, errString)

                        showToastMsg(errString.toString())
                    }

                    override fun onAuthenticationFailed() {
                        super.onAuthenticationFailed()
                    }

                    override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult) {
                        super.onAuthenticationSucceeded(result)

                    }
                })

`

4

4 回答 4

1

这是解决此问题的方法,但不是完整的修复方法。

您需要recreate()在完成身份验证后所做的任何事情后打电话。

这将重新启动活动并允许再次显示生物特征提示。

于 2019-10-16T17:59:00.190 回答
1

似乎它与这一行有关: .setDeviceCredentialAllowed(true)

如果我将其更改为 false,则每次都可以正常工作而无需重新创建活动

于 2019-11-27T08:45:01.987 回答
0

消除:

private val executor: Executor by lazy {
    Executors.newSingleThreadExecutor()
}

并将您的执行人替换为:

ContextCompat.getMainExecutor(activity)
于 2020-06-17T13:00:33.533 回答
0

你在什么设备上测试?你能在公共问题跟踪器上同时提交一个错误

  1. adb bugreport foo.zip
  2. 理想情况下是重现问题的示例应用程序的 .zip 文件?
于 2019-10-17T03:21:08.877 回答