在生物识别提示上按取消会使应用程序崩溃,错误类型 - java.lang.NullPointerException

pressing cancel on the biometric prompt crashes the app, Error type - java.lang.NullPointerException

只有取消按钮会使应用程序崩溃。
正常身份验证工作正常
在提示之外触摸也会关闭提示。
但是触摸取消按钮会使应用程序崩溃。
此外,我没有声明任何可空变量或 lateinit 变量。

这是堆栈跟踪 -

2022-04-17 12:29:57.279 15888-15888/com.kenetic.blockchainvs E/ic.blockchainv: [qarth_debug:]  get PatchStore::createDisableExceptionQarthFile method fail.
2022-04-17 12:29:57.282 15888-15888/com.kenetic.blockchainvs E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.kenetic.blockchainvs, PID: 15888
    java.lang.NullPointerException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkNotNullParameter, parameter <anonymous parameter 0>
        at com.kenetic.blockchainvs.fingerprint.FingerPrintAuthentication.verifyBiometrics$lambda-0(Unknown Source:2)
        at com.kenetic.blockchainvs.fingerprint.FingerPrintAuthentication.$r8$lambda$ms5jsHgjq-6k8P4aokBQ7-zcrrI(Unknown Source:0)
        at com.kenetic.blockchainvs.fingerprint.FingerPrintAuthentication$$ExternalSyntheticLambda0.onClick(Unknown Source:0)
        at android.hardware.biometrics.BiometricPrompt.lambda$onDialogDismissed(BiometricPrompt.java:226)
        at android.hardware.biometrics.-$$Lambda$BiometricPrompt$J5PqpiT8xZNiNN1gy9VraVgknaQ.run(Unknown Source:2)
        at android.os.Handler.handleCallback(Handler.java:907)
        at android.os.Handler.dispatchMessage(Handler.java:105)
        at android.os.Looper.loop(Looper.java:216)
        at android.app.ActivityThread.main(ActivityThread.java:7625)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:987)

这是代码 -

任务枚举-

enum class FingerPrintTaskEnum {
    LOGIN, TRANSACTION
}

指纹认证-

package com.kenetic.blockchainvs.fingerprint

import android.content.Context
import android.content.DialogInterface
import android.hardware.biometrics.BiometricPrompt
import android.os.Build
import android.os.CancellationSignal
import android.widget.Toast
import androidx.annotation.RequiresApi

private const val TAG = "FingerPrintAuthentication"

class FingerPrintAuthentication(
    private val context: Context,
    private val taskEnum: FingerPrintTaskEnum,
    private val task: () -> Unit
) {
    private val authenticationCallback: BiometricPrompt.AuthenticationCallback
        get() =
            @RequiresApi(Build.VERSION_CODES.P)
            object : BiometricPrompt.AuthenticationCallback() {
                override fun onAuthenticationError(errorCode: Int, errString: CharSequence?) {
                    super.onAuthenticationError(errorCode, errString)
                    Toast.makeText(
                        context,
                        "Authentication failed, ${taskEnum.name} Cannot Be Executed",
                        Toast.LENGTH_SHORT
                    ).show()
                }

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

    @RequiresApi(Build.VERSION_CODES.P)
    fun verifyBiometrics() {
        val biometricPrompt = BiometricPrompt.Builder(context)
            .setTitle(taskEnum.name)
            .setSubtitle("Authentication Required To Proceed")
            .setDescription(
                when (taskEnum) {
                    FingerPrintTaskEnum.LOGIN -> "Login To Account Through Fingerprint"
                    FingerPrintTaskEnum.TRANSACTION -> "Scan Your Fingerprint\nTo Authenticate Transaction"
                }
            )
            .setNegativeButton("Cancel", context.mainExecutor) { _: DialogInterface, _: Int -> }
            .build()
        biometricPrompt.authenticate(
            getCancellationSignal(),
            context.mainExecutor,
            authenticationCallback
        )
    }

    private fun getCancellationSignal(): CancellationSignal {
        val cancellationSignal = CancellationSignal()
        cancellationSignal.setOnCancelListener {
            Toast.makeText(
                context, "Fingerprint Authentication Cancelled", Toast.LENGTH_SHORT
            ).show()
        }
        return cancellationSignal
    }
}

我已经使用 requireContext()

从片段调用了此 class

尝试更改:

.setNegativeButton("Cancel", context.mainExecutor) { _: DialogInterface, _: Int -> }

至:

.setNegativeButton("Cancel", context.mainExecutor) { _: DialogInterface?, _: Int -> }

(IOW,将 DialogInterface 更改为 DialogInterface?