0

I'm using BiometricPrompt on my app but this code throws NullPointerException on some devices (for instance Redmi 5 Plus)

if (biometricManager.canAuthenticate() == BiometricManager.BIOMETRIC_SUCCESS) {
    biometricPrompt.authenticate(getPromptInfo(), cryptoObject)
}

private fun getPromptInfo(): BiometricPrompt.PromptInfo {
    return BiometricPrompt.PromptInfo.Builder()
        .setTitle("My App's Authentication")
        .setNegativeButtonText("Cancel")
        .setSubtitle("Please login to get access")
        .setDescription("My App is using Android biometric authentication")
        .build()
}

Caused by:

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setVisibility(int)' on a null object reference

How can I fix this?

UPDATE (Added logs) :

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setVisibility(int)' on a null object reference
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2817)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2895)
        at android.app.ActivityThread.-wrap11(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1616)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:176)
        at android.app.ActivityThread.main(ActivityThread.java:6651)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:824)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setVisibility(int)' on a null object reference
        at androidx.biometric.FingerprintDialogFragment.onCreateDialog(FingerprintDialogFragment.java:199)
        at androidx.fragment.app.DialogFragment.onGetLayoutInflater(DialogFragment.java:419)
        at androidx.fragment.app.Fragment.performGetLayoutInflater(Fragment.java:1484)
        at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:320)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1187)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1356)
        at androidx.fragment.app.FragmentManager.moveFragmentToExpectedState(FragmentManager.java:1434)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1497)
        at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2625)
        at androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:2577)
        at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:247)
        at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:541)
        at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:210)
        at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1335)
        at android.app.Activity.performStart(Activity.java:7108)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2780)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2895) 
        at android.app.ActivityThread.-wrap11(Unknown Source:0) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1616) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:176) 
        at android.app.ActivityThread.main(ActivityThread.java:6651) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:824) 
Alvin
  • 894
  • 8
  • 16
  • 1
    Please post code where you are using setVisibility(). that TextView seems to be null – Astha Garg Sep 08 '20 at 08:17
  • @Astha It's not a TextView that I'm changing the visibility of. It's somewhere in BiometricPrompt dialog i guess. – Alvin Sep 08 '20 at 08:27
  • Note that there is a [Jetpack library for Biometric](https://developer.android.com/jetpack/androidx/releases/biometric), you may want to see if it resolves the issue, or state clearly which package/version you are using. – Morrison Chang Sep 08 '20 at 08:47
  • @MorrisonChang I'm using "androidx.biometric:biometric:1.0.1". The alpha version gives the same exception. – Alvin Sep 08 '20 at 08:53
  • Not sure if [this AOSP issue ticket](https://issuetracker.google.com/issues/167951429) is yours but it looks similar. – Morrison Chang Sep 08 '20 at 08:59
  • @Alvin : Yes you might be changing visibility of Biometric promt, but the crash is coming at android.widget.TextView.setVisibility(int)'. Please check your crash log for line number and to resolve that null value. – Astha Garg Sep 08 '20 at 09:19
  • @Astha According to the stacktrace, the problem is in FingerprintDialogFragment, when it tries to set subtitle. The TextView is null. (Line 197 & 199) – Alvin Sep 09 '20 at 07:38
  • Oh i see, that's why complete crash logs are important :) – Astha Garg Sep 09 '20 at 07:42
  • @Astha Updated the question, addding logs :) – Alvin Sep 09 '20 at 08:14
  • What is the behavior, when authenticate is invoked by passing null in the second parameter ? i.e, cryptoObject as null – Shanker Sep 11 '20 at 06:31
  • @Shank Still the same. – Alvin Sep 11 '20 at 07:05

0 Answers0