Android Show a Biometric Fingerprint Authentication Dialog Example

Sovary May 8, 2022 6.03K
8 minutes read

Biometric authentication is the method of validating a user's identification based on unique biological appearances such as the user's retina, voice, fingerprint, or facial features, and it offers several benefits. Biometric authentication allows you to rapidly unlock your smartphone using your fingerprint or face or parttern, verifying that you are the one using it.

Pre-requisite

You must add a dependency for the AndroidX Biometric Library, which is a one-stop user authentication solution for Android developers, before you build and launch.  

Implementation

Step 1: Create a new project in Android Studio (File -> New -> Project -> Select Empty Activty -> Name project -> Finish)

Step 2: Insert AndroidX Biometric to build.gradle file (Module: app). (app -> build.gradle(Module: app))

implementation 'com.google.android.play:core:1.10.0'

After add this line of code in dependency section you will see top right cornor to sync link, then press that to download the library.

Step 3: In android to be able to access feature biometric we have to add permission in AndroidManifest.xml. Open app -> manifests -> AndroidManifest.xml

<uses-permission android:name="android.permission.USE_BIOMETRIC"></uses-permission>

Step 4: Add icon fingerprint for design the layout. Open app -> res -> drawable -> New -> Vector Asset

android vector assets select


Click clip art and search for fingerprint icon. There are options to customized color, size and name you might play around with that or just leave by default then Next -> Finish. 

That fingerprint icon we will use in step 5 with image for better design which is name "ic_baseline_fingerprint".
fingerprint app preview demo tutorial

Step 5: We will design sample activity to test with both function fingerprint with PIN code input in activity_main.xml. Open app -> res -> layout -> activity_main.xml. Paste code below:

<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_baseline_fingerprint"
        android:layout_centerInParent="true"/>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text=""
        android:id="@+id/tx_info"/>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Login Fingerprint"
        android:backgroundTint="@color/teal_700"
        android:layout_centerInParent="true"
        android:id="@+id/btn_fp"
        />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Fingerprint + PIN"
        android:layout_centerInParent="true"
        android:id="@+id/btn_fppin"
        />
</androidx.appcompat.widget.LinearLayoutCompat>

Step 6: We will implement on Java class. Navigate to app - > java -> package -> MainActivity.java

package com.codebeginner.sovary.fingerprinttest;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.biometric.*;
import androidx.core.content.ContextCompat;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import java.util.concurrent.Executor;
import static androidx.biometric.BiometricManager.Authenticators.*;

public class MainActivity extends AppCompatActivity {

    Button btn_fp,btn_fppin;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        //assign button reference from view
        btn_fp = findViewById(R.id.btn_fp);
        btn_fppin  = findViewById(R.id.btn_fppin);
        
        //create new method to check whether support or not
        checkBioMetricSupported();
    }
}

Step 7: In the same class MainActivity.java we will create new method checkBioMetricSupported(); to check status fingerprint senesor so we implement it as below.

//must running android 6
void checkBioMetricSupported()
{
    BiometricManager manager = BiometricManager.from(this);
    String info="";
    switch (manager.canAuthenticate(BIOMETRIC_WEAK | BIOMETRIC_STRONG))
    {
        case BiometricManager.BIOMETRIC_SUCCESS:
            info = "App can authenticate using biometrics.";
            enableButton(true);
            break;
        case BiometricManager.BIOMETRIC_ERROR_NO_HARDWARE:
            info = "No biometric features available on this device.";
            enableButton(false);
            break;
        case BiometricManager.BIOMETRIC_ERROR_HW_UNAVAILABLE:
            info = "Biometric features are currently unavailable.";
            enableButton(false);
            break;
        case BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED:
            info = "Need register at least one finger print";
            enableButton(false,true);
            break;
        default:
            info= "Unknown cause";
            enableButton(false);
    }

    //set message to text view so we can see what happen with sensor device
    TextView txinfo =  findViewById(R.id.tx_info);
    txinfo.setText(info);
}

Now you will see there is no method enableButton() implement yet, because red highlight. Okay we will create that method.

Step 8: To make more interesting application and prevent user to click button because of their sensor device is broken or something missed we disable the button with explicit method enableButton()

void enableButton(boolean enable)
{
    //just enable or disable button
    btn_fp.setEnabled(enable);
    btn_fppin.setEnabled(true);
}
void enableButton(boolean enable,boolean enroll)
{
    enableButton(enable);

    if(!enroll) return;
    // Prompts the user to create credentials that your app accepts.
    //Open settings to set credential fingerprint or PIN
    final Intent enrollIntent = new Intent(Settings.ACTION_BIOMETRIC_ENROLL);
    enrollIntent.putExtra(Settings.EXTRA_BIOMETRIC_AUTHENTICATORS_ALLOWED,
            BIOMETRIC_STRONG | DEVICE_CREDENTIAL);
    startActivity(enrollIntent);
}


Step 9: After we are checking status sensor, we start perform action scan fingerprint. In onCreate() after checkBioMetricSupported(); we start implement as below code

Executor executor = ContextCompat.getMainExecutor(this);
BiometricPrompt biometricPrompt = new BiometricPrompt(MainActivity.this,
        executor, new BiometricPrompt.AuthenticationCallback() {
    @Override
    public void onAuthenticationError(int errorCode,
                                        @NonNull CharSequence errString) {
        super.onAuthenticationError(errorCode, errString);
        Toast.makeText(getApplicationContext(),
                "Authentication error: " + errString, Toast.LENGTH_SHORT)
                .show();
    }
    
    // this method will automatically call when it is succeed verify fingerprint
    @Override
    public void onAuthenticationSucceeded(
            @NonNull BiometricPrompt.AuthenticationResult result) {
        super.onAuthenticationSucceeded(result);
        Toast.makeText(getApplicationContext(),
                "Authentication succeeded!" , Toast.LENGTH_SHORT).show();
    }

    // this method will automatically call when it is failed verify fingerprint
    @Override
    public void onAuthenticationFailed() {
        super.onAuthenticationFailed();
        //attempt not regconized fingerprint
        Toast.makeText(getApplicationContext(), "Authentication failed",
                Toast.LENGTH_SHORT)
                .show();
    }
});

These code above in step 8 not will happen, we will activate that code by hit buttons click action.

Step 10: Setup action buttons click to perform dialog fingerprint.

//perform action button only fingerprint
btn_fp.setOnClickListener(view -> {

    // call method launch dialog fingerprint    
    BiometricPrompt.PromptInfo.Builder promptInfo = dialogMetric();
    promptInfo.setNegativeButtonText("Cancel");

    //activate callback if it succeed
    biometricPrompt.authenticate(promptInfo.build());
});

//perform action button fingerprint with PIN code input
btn_fppin.setOnClickListener(view -> {

    // call method launch dialog fingerprint
    BiometricPrompt.PromptInfo.Builder promptInfo = dialogMetric();
    promptInfo.setDeviceCredentialAllowed(true);

    //activate callback if it succeed
    biometricPrompt.authenticate(promptInfo.build());
});


Wait... you will see red highlight dialogMetric(); because we're not create this method yet.

Step 11: Create new method dialogMetric(); to show dialog popup to scan fingerprint.

BiometricPrompt.PromptInfo.Builder dialogMetric()
{
    //Show prompt dialog
    return new BiometricPrompt.PromptInfo.Builder()
            .setTitle("Biometric login")
            .setSubtitle("Log in using your biometric credential");
}


Alright, finally you're done look at full code below if something miss.

Final code

package com.codebeginner.sovary.fingerprinttest;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.biometric.*;
import androidx.core.content.ContextCompat;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import java.util.concurrent.Executor;
import static androidx.biometric.BiometricManager.Authenticators.*;

public class MainActivity extends AppCompatActivity {

    Button btn_fp,btn_fppin;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        //assign button reference from view
        btn_fp = findViewById(R.id.btn_fp);
        btn_fppin  = findViewById(R.id.btn_fppin);
        
        //create new method to check whether support or not
        checkBioMetricSupported();
        Executor executor = ContextCompat.getMainExecutor(this);
        BiometricPrompt biometricPrompt = new BiometricPrompt(MainActivity.this,
                executor, new BiometricPrompt.AuthenticationCallback() {
            @Override
            public void onAuthenticationError(int errorCode,
                                                @NonNull CharSequence errString) {
                super.onAuthenticationError(errorCode, errString);
                Toast.makeText(getApplicationContext(),
                        "Authentication error: " + errString, Toast.LENGTH_SHORT)
                        .show();
            }
            
            // this method will automatically call when it is succeed verify fingerprint
            @Override
            public void onAuthenticationSucceeded(
                    @NonNull BiometricPrompt.AuthenticationResult result) {
                super.onAuthenticationSucceeded(result);
                Toast.makeText(getApplicationContext(),
                        "Authentication succeeded!" , Toast.LENGTH_SHORT).show();
            }

            // this method will automatically call when it is failed verify fingerprint
            @Override
            public void onAuthenticationFailed() {
                super.onAuthenticationFailed();
                //attempt not regconized fingerprint
                Toast.makeText(getApplicationContext(), "Authentication failed",
                        Toast.LENGTH_SHORT)
                        .show();
            }
        });
        //perform action button only fingerprint
        btn_fp.setOnClickListener(view -> {

            // call method launch dialog fingerprint    
            BiometricPrompt.PromptInfo.Builder promptInfo = dialogMetric();
            promptInfo.setNegativeButtonText("Cancel");

            //activate callback if it succeed
            biometricPrompt.authenticate(promptInfo.build());
        });

        //perform action button fingerprint with PIN code input
        btn_fppin.setOnClickListener(view -> {

            // call method launch dialog fingerprint
            BiometricPrompt.PromptInfo.Builder promptInfo = dialogMetric();
            promptInfo.setDeviceCredentialAllowed(true);

            //activate callback if it succeed
            biometricPrompt.authenticate(promptInfo.build());
        });
    }

    BiometricPrompt.PromptInfo.Builder dialogMetric()
    {
        //Show prompt dialog
        return new BiometricPrompt.PromptInfo.Builder()
                .setTitle("Biometric login")
                .setSubtitle("Log in using your biometric credential");
    }

    //must running android 6
    void checkBioMetricSupported()
    {
        BiometricManager manager = BiometricManager.from(this);
        String info="";
        switch (manager.canAuthenticate(BIOMETRIC_WEAK | BIOMETRIC_STRONG))
        {
            case BiometricManager.BIOMETRIC_SUCCESS:
                info = "App can authenticate using biometrics.";
                enableButton(true);
                break;
            case BiometricManager.BIOMETRIC_ERROR_NO_HARDWARE:
                info = "No biometric features available on this device.";
                enableButton(false);
                break;
            case BiometricManager.BIOMETRIC_ERROR_HW_UNAVAILABLE:
                info = "Biometric features are currently unavailable.";
                enableButton(false);
                break;
            case BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED:
                info = "Need register at least one finger print";
                enableButton(false,true);
                break;
            default:
                info= "Unknown cause";
                enableButton(false);
        }

        //set message to text view so we can see what happen with sensor device
        TextView txinfo =  findViewById(R.id.tx_info);
        txinfo.setText(info);
    }

    void enableButton(boolean enable)
    {
        //just enable or disable button
        btn_fp.setEnabled(enable);
        btn_fppin.setEnabled(true);
    }
    void enableButton(boolean enable,boolean enroll)
    {
        enableButton(enable);

        if(!enroll) return;
        // Prompts the user to create credentials that your app accepts.
        //Open settings to set credential fingerprint or PIN
        final Intent enrollIntent = new Intent(Settings.ACTION_BIOMETRIC_ENROLL);
        enrollIntent.putExtra(Settings.EXTRA_BIOMETRIC_AUTHENTICATORS_ALLOWED,
                BIOMETRIC_STRONG | DEVICE_CREDENTIAL);
        startActivity(enrollIntent);
    }
}

Download Source Code

You might Also Like:

Android  Java  Video 
Author

Founder of CamboTutorial.com, I am happy to share my knowledge related to programming that can help other people. I love write tutorial related to PHP, Laravel, Python, Java, Android Developement, all published post are make simple and easy to understand for beginner. Follow him    

Search