Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Crash using biometric androidx library

In my app I'm using androidx biometric support library 1.0.1. On Android 9 I can see this kind of bug but I have no idea where they come from::

02-01 13:00:06.422 23937 23937 E AndroidRuntime: FATAL EXCEPTION: main
02-01 13:00:06.422 23937 23937 E AndroidRuntime: Process: xxxxxxx, PID: 23871
02-01 13:00:06.422 23937 23937 E AndroidRuntime: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.hardware.fingerprint.FingerprintManager.getErrorString(int, int)' on a null object reference
02-01 13:00:06.422 23937 23937 E AndroidRuntime:    at android.hardware.biometrics.BiometricPrompt.lambda$sendError$0(BiometricPrompt.java:490)
02-01 13:00:06.422 23937 23937 E AndroidRuntime:    at android.hardware.biometrics.-$$Lambda$BiometricPrompt$HqBGXtBUWNc-v8NoHYsj2gLfaRw.run(Unknown Source:6)
02-01 13:00:06.422 23937 23937 E AndroidRuntime:    at android.os.Handler.handleCallback(Handler.java:873)
02-01 13:00:06.422 23937 23937 E AndroidRuntime:    at android.os.Handler.dispatchMessage(Handler.java:99)
02-01 13:00:06.422 23937 23937 E AndroidRuntime:    at android.os.Looper.loop(Looper.java:193)
02-01 13:00:06.422 23937 23937 E AndroidRuntime:    at android.app.ActivityThread.main(ActivityThread.java:6672)
02-01 13:00:06.422 23937 23937 E AndroidRuntime:    at java.lang.reflect.Method.invoke(Native Method)
02-01 13:00:06.422 23937 23937 E AndroidRuntime:    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:495)
02-01 13:00:06.422 23937 23937 E AndroidRuntime:    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:860)

Code:

        KeyguardManager km = (KeyguardManager) getContext().getSystemService(KEYGUARD_SERVICE);
        BiometricPrompt.Builder builder = new BiometricPrompt.Builder(getContext().getApplicationContext());
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            builder.setConfirmationRequired(true);
            if (km != null && km.isDeviceSecure()) {
                builder.setDeviceCredentialAllowed(true);
            } else {
                builder.setNegativeButton(getContext().getResources().getString(android.R.string.cancel), getContext().getApplicationContext().getMainExecutor(), (dialog, which) -> {
                //something
                });
            }
        } else {
            builder.setNegativeButton(getContext().getResources().getString(android.R.string.cancel), getContext().getApplicationContext().getMainExecutor(), (dialog, which) -> {
                //something
            });
        }
        builder.setDescription(getContext().getResources().getString(R.string.confirm_pin));
        builder.setTitle(getContext().getResources().getString(R.string.modify_pin));
        BiometricPrompt prompt = builder.build();
        prompt.authenticate(new CancellationSignal(), getContext().getMainExecutor(), new BiometricPrompt.AuthenticationCallback() {
            @Override
            public void onAuthenticationError(int errorCode, CharSequence errString) {
            }

            @Override
            public void onAuthenticationFailed() {
            }
        });
like image 287
greywolf82 Avatar asked Mar 01 '26 10:03

greywolf82


1 Answers

Biometric support library 1.0.1. On Android 9 because Some devices don't have Biometric Sensor. You can follow the below steps.

1> Check Biometric Support or not

private fun checkBiometricSupportOrNot():Boolean {

    val keyguardManager: KeyguardManager =
        getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager

    if (!keyguardManager.isKeyguardSecure) {
        notifyUser("Fingerprint hs not been enabled in settings.")
        return false
    }

    if (ActivityCompat.checkSelfPermission(
            this,
            android.Manifest.permission.USE_BIOMETRIC
        ) != PackageManager.PERMISSION_GRANTED
    ) {
        notifyUser("Fingerprint hs not been enabled in settings.")
        return false
    }
    return if (packageManager.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)) true else true
}

2>Check conduction in the click event

  tvLogin.setOnClickListener {

        if (checkBiometricSupportOrNot()){
            val biometricPrompt : BiometricPrompt = BiometricPrompt.Builder(this)
                .setTitle("Title")
                .setSubtitle("Authenticaion is required")
                .setDescription("Fingerprint Authentication")
                .setNegativeButton("Cancel", this.mainExecutor) { _, _ ->
                }.build()
            biometricPrompt.authenticate(getCancellationSignal(), mainExecutor, authenticationCallback)
        }else{
            notifyUser("Fingerprint hs not been enabled in settings.")
        }
    }
like image 113
Piush Kumar Avatar answered Mar 03 '26 22:03

Piush Kumar