《Android》『FingerprintManager』- 指紋辨識功能的基本用法
《Android Developers 參考文獻》
《繼承架構》
extends Object
java.lang.Object
↳ android.hardware.fingerprint.FingerprintManager
《簡單介紹》
FingerprintManager 是在 Android 6.0 Marshmallow 版本中(targetSdkVersion = “23”),所提供的一個新的 API,利用這個 API,我們使得手機可以利用鏡頭,在設定好要用來加密的手指指紋後(透過拍照特寫手指頭的方式,儲存至少一張照片),再利用指紋比對的方式來核實身份。
《基本用法》
要在程式中使用 Fingerprint API,主要區分為三個步驟,條列如下 –
Step3. 透過 FingerprintManager 執行 Authenticate 的動作。
在使用 FingerPrint API 前,我們必須先在 AndroidManifest.xml 中,加入 FingerPrint 的使用權限。
1 2 3 4 5 6 7 8 9 10 |
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.xylon.fingerprintsample" > <uses-permission android:name="android.permission.USE_FINGERPRINT" /> <application> ... </application> </manifest> |
首先我們必須要確認所使用的裝置是否支援 fingerprint reader,接著在設定選項中設定安全性為 Fingerprint(Settings -> Security -> Fingerprint),最後確認是否有儲存了至少一枚指紋(fingerprint),以下透過程式碼片段的方式,示範如何在程式中,檢查以上資訊。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
public class MainActivity extends AppCompatActivity { private KeyguardManager mKeyguardManager; private FingerprintManager mFingerprintManager; private CancellationSignal cancellationSignal; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mKeyguardManager = (KeyguardManager)getSystemService(Activity.KEYGUARD_SERVICE); mFingerprintManager = (FingerprintManager)getSystemService(Activity.FINGERPRINT_SERVICE);//FingerprintManager.class if (!mKeyguardManager.isKeyguardSecure()) { //是否有設定 fingerprint screen lock return; } if (checkSelfPermission(Manifest.permission.USE_FINGERPRINT) == PackageManager.PERMISSION_GRANTED) //In SDK 23, we need to check the permission before we call FingerprintManager API functionality. { if (!mFingerprintManager.isHardwareDetected()) { //硬體裝置是否有 fingerprint reader . . return; } if (!mFingerprintManager.hasEnrolledFingerprints()) { //是否有設定至少一枚指紋 . . return; } } startFingerprintListening(); } . . . } |
Check Requirement
程式碼解析如下 –
1. mKeyguardManager.isKeyguardSecure() : 是否有設定 screen lock
2. mFingerprintManager.isHardwareDetected() : 硬體裝置是否支援 fingerprint reader
3. mFingerprintManager.hasEnrolledFingerprints() : 是否有設定至少一枚指紋
Step3. 透過 FingerprintManager 執行 Authenticate 的動作
在通過 Step1 的裝置環境檢查之後,我們就可以開始透過 FingerprintManager 執行 Authenticate (辨識認證)的動作,authenticate的方法宣告參數如下 –
1 2 3 4 5 |
public void authenticate (FingerprintManager.CryptoObject crypto, CancellationSignal cancel, int flags, FingerprintManager.AuthenticationCallback callback, Handler handler) |
authenticate 的方法參數
其中 crypto 為 Android 6.0中 crypto objects 的 wrapper class,可以透過它讓 authenticate 過程更為安全,但也可以不使用;cancel 即用來取消 authenticate 的物件;flags 為一個旗標,只能設為 0;callback 用來接受 authenticate 成功與否,一共有三個 callback method;最後 handler 為 optional 的參數,如果有使用,則 FingerprintManager 可以透過它來傳遞訊息。
實際程式碼片段如下 –
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
public class MainActivity extends AppCompatActivity { private KeyguardManager mKeyguardManager; private FingerprintManager mFingerprintManager; private CancellationSignal cancellationSignal; @Override protected void onCreate(Bundle savedInstanceState) { . . . startFingerprintListening(); } private void startFingerprintListening() { cancellationSignal = new CancellationSignal(); if (checkSelfPermission(Manifest.permission.USE_FINGERPRINT) == PackageManager.PERMISSION_GRANTED) //In SDK 23, we need to check the permission before we call FingerprintManager API functionality. { mFingerprintManager.authenticate(null, //crypto objects 的 wrapper class,可以透過它讓 authenticate 過程更為安全,但也可以不使用。 cancellationSignal, //用來取消 authenticate 的 object 0, //optional flags; should be 0 mAuthenticationCallback, //callback 用來接收 authenticate 成功與否,有三個 callback method null); //optional 的參數,如果有使用,FingerprintManager 會透過它來傳遞訊息 } } FingerprintManager.AuthenticationCallback mAuthenticationCallback = new FingerprintManager.AuthenticationCallback() { @Override public void onAuthenticationError(int errorCode, CharSequence errString) { Log.e("", "error " + errorCode + " " + errString); } @Override public void onAuthenticationFailed() { Log.e("", "onAuthenticationFailed"); } @Override public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) { Log.i("", "onAuthenticationSucceeded"); } }; @Override public void onPause() { super.onPause(); cancellationSignal.cancel(); cancellationSignal = null; } } |
其中 mAuthenticationCallback 用來接收指紋辨識成功與否,會有三個 callback method,分別條列如下 –
onAuthenticationError – 辨識錯誤
onAuthenticationFailed – 辨識失敗
onAuthenticationSucceeded – 辨識成功
臉書留言
一般留言