iT邦幫忙

2022 iThome 鐵人賽

DAY 17
0
Mobile Development

Android Studio 30天學習紀錄系列 第 17

Android Studio 30天學習紀錄-Day17 Biometric指紋認證

  • 分享至 

  • xImage
  •  

Biometric可進行指紋認證的功能,而官方也有提供關於此的一些方法,整體用法我覺得跟之前的Fingerprint蠻相似的,都是去產生一個Dialog視窗讓你透過手機的掃描器來進行指紋辨識的認證,另外如果對指紋辨識這些感興趣的,也可以看看有關Fido2的文獻或範例,那麼現在先加入今天需要的Biometric依賴到gradle中。

依賴

implementation 'androidx.biometric:biometric:1.1.0'

Biometric

今天建的生物辨識視窗相對簡易,主要會由三大部分組成:

  • BiometricPrompt.PromptInfo
    指紋辨識窗的設定
    當然還有一些其他的可進行設定,但目前可能最常用到的是這些。
BiometricPrompt.PromptInfo prompt=new BiometricPrompt.PromptInfo.Builder()
        .setTitle("")//設定視窗標題
        .setSubtitle("")//設定視窗副標題
        .setNegativeButtonText("")//設定返回按鈕文字
        .build();
  • BiometricPrompt
    開啟認證、並回傳認證是否成功
    BiometricPrompt biometricPrompt=new BiometricPrompt(this, ContextCompat.getMainExecutor(this),
    new BiometricPrompt.AuthenticationCallback() {
    @Override
    public void onAuthenticationError(int errorCode, @NonNull CharSequence errString) {
    super.onAuthenticationError(errorCode, errString);
    //當發生Error...(按了返回按鈕也是進這邊)
    }

                  @Override
                  public void onAuthenticationSucceeded(@NonNull BiometricPrompt.AuthenticationResult result) {
                      super.onAuthenticationSucceeded(result);
                      //當驗證成功...
                  }
    
                  @Override
                  public void onAuthenticationFailed() {
                      super.onAuthenticationFailed();
                      //當驗證失敗...
                  }
              });
    

``

  • BiometricManager
    可判斷此裝置支援什麼驗證
//滿足3類生物識別
        if(manager.canAuthenticate(BiometricManager.Authenticators.BIOMETRIC_STRONG)==
                BiometricManager.BIOMETRIC_SUCCESS){
            Toast.makeText(this,"BIOMETRIC_STRONG",Toast.LENGTH_SHORT).show();
        }
        //滿足2類生物識別
        else if(manager.canAuthenticate(BiometricManager.Authenticators.BIOMETRIC_WEAK)==
                BiometricManager.BIOMETRIC_SUCCESS){
            Toast.makeText(this,"BIOMETRIC_WEAK",Toast.LENGTH_SHORT).show();
        }
        //裝置可進行非生物辨識的認證(PIN、圖案、密碼)
        else if(manager.canAuthenticate(BiometricManager.Authenticators.DEVICE_CREDENTIAL)==
                BiometricManager.BIOMETRIC_SUCCESS){
            Toast.makeText(this,"DEVICE_CREDENTIAL",Toast.LENGTH_SHORT).show();
        }
        else{
            Toast.makeText(this,"此裝置無法進行生物辨識",Toast.LENGTH_SHORT).show();
        }

切記,一定要先去你的裝置先新增你的指紋,不然他讀不到喔!


MainActivity

那麼直接進入到程式,今天就不放UI了(主要只放了一顆id為btn_biometric的Button)。

public class MainActivity extends AppCompatActivity {
    //管控裝置支援什麼類型的認證
    private BiometricManager manager;
    //指紋辨識窗的設定
    private BiometricPrompt.PromptInfo prompt;
    //開啟認證、並回傳認證是否成功
    private BiometricPrompt biometricPrompt;
    private Button btn_biometric;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        manager = BiometricManager.from(this);
        btn_biometric=findViewById(R.id.btn_biometric);
        prompt=new BiometricPrompt.PromptInfo.Builder()
                .setTitle("指紋辨識")
                .setSubtitle("請使用掃描器進行認證")
                .setNegativeButtonText("取消認證")
                .build();
        biometricPrompt = new BiometricPrompt(this, ContextCompat.getMainExecutor(this),
                new BiometricPrompt.AuthenticationCallback() {
                    @Override
                    public void onAuthenticationError(int errorCode, @NonNull CharSequence errString) {
                        super.onAuthenticationError(errorCode, errString);
                        Toast.makeText(getApplicationContext(),"Authen Error:"+errString, Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void onAuthenticationSucceeded(@NonNull BiometricPrompt.AuthenticationResult result) {
                        super.onAuthenticationSucceeded(result);
                        Toast.makeText(getApplicationContext(), "驗證成功!", Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void onAuthenticationFailed() {
                        super.onAuthenticationFailed();
                        Toast.makeText(getApplicationContext(),"Authen Failed",Toast.LENGTH_SHORT).show();
                    }
                });
        btn_biometric.setOnClickListener(view -> {
            biometricPrompt.authenticate(prompt);//開始認證
        });
        //滿足3類生物識別
        if(manager.canAuthenticate(BiometricManager.Authenticators.BIOMETRIC_STRONG)==
                BiometricManager.BIOMETRIC_SUCCESS){
            Toast.makeText(this,"BIOMETRIC_STRONG",Toast.LENGTH_SHORT).show();
        }
        //滿足2類生物識別
        else if(manager.canAuthenticate(BiometricManager.Authenticators.BIOMETRIC_WEAK)==
                BiometricManager.BIOMETRIC_SUCCESS){
            Toast.makeText(this,"BIOMETRIC_WEAK",Toast.LENGTH_SHORT).show();
        }
        //裝置可進行非生物辨識的認證(PIN、圖案、密碼)
        else if(manager.canAuthenticate(BiometricManager.Authenticators.DEVICE_CREDENTIAL)==
                BiometricManager.BIOMETRIC_SUCCESS){
            Toast.makeText(this,"DEVICE_CREDENTIAL",Toast.LENGTH_SHORT).show();
        }
        else{
            Toast.makeText(this,"此裝置無法進行生物辨識",Toast.LENGTH_SHORT).show();
        }
    }
}

運行結果

https://ithelp.ithome.com.tw/upload/images/20220928/20139259wYH9FTGpEH.jpg
https://ithelp.ithome.com.tw/upload/images/20220928/20139259IrYWJ5qgRW.jpg
https://ithelp.ithome.com.tw/upload/images/20220928/20139259FTm1RG3YMt.jpg
https://ithelp.ithome.com.tw/upload/images/20220928/201392592fRDrgewT5.jpg


上一篇
Android Studio 30天學習紀錄-Day16 SQLiteDataBase
下一篇
Android Studio 30天學習紀錄-Day18 Kotlin&基礎語法
系列文
Android Studio 30天學習紀錄30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言