BiometricPrompt执行程序和/或回调为null

时间:2019-10-08 12:43:15

标签: android android-biometric-prompt android-biometric

我正在使用public void load() { try { string sql; sql = "select * from student"; cmd = new SqlCommand(sql, con); con.Open(); dr = cmd.ExecuteReader(); dee = new SqlDataAdapter(sql, con); while (dr.Read()) { dataGridView1.Rows.Add(dr[0], dr[1], dr[2], dr[3]); } con.Close(); } catch(Exception ex) { } finally { con.Close(); cmd.Dispose(); } } 中的BiometricPrompt进行身份验证过程。 但是我面临一个非常奇怪的问题。

我第一次调用androidx.biometric:biometric:1.0.0-beta02时一切正常,该库根据设置的安全方法(模式,指纹,密码等)向我显示屏幕,然后调用该回调,一切正常。

问题是当我第二次致电biometricsPromt.authenticate()时收到错误消息:

  

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

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

有人遇到相同的问题或有什么想法可能是什么问题吗?

这就是我创建BiometricPromt的方式

`

biometricsPromt.authenticate()

`

这是我的称呼方式:

`

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
        }

`

4 个答案:

答案 0 :(得分:1)

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

完成身份验证后要完成的所有操作后,您需要致电recreate()

这将重新启动活动,并允许再次显示生物识别提示。

答案 1 :(得分:0)

您要在什么设备上进行测试?您可以同时在公共问题跟踪程序here上提交错误吗?

  1. adb bugreport foo.zip
  2. 理想情况是重现此问题的示例应用程序的.zip?

答案 2 :(得分:0)

似乎与以下行有关:.setDeviceCredentialAllowed(true)

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

答案 3 :(得分:0)

删除:

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

并用以下代码替换您的执行器:

ContextCompat.getMainExecutor(activity)