情境
如果你想要做指紋辨識,早期官方提供了 Fingerprint 類別讓開發者進行操作,隨著生物辨識廣泛應用在手機上,所以在 API 28 以後,Google 官方直接棄用 Fingerprint 類別,另外提供一個 BiometricPrompt 讓開發者更有彈性的寫出生物辨識系統。
完整程式碼
如果你需要完整程式碼,可以到 GitHub 上觀看或下載。
說明
一開始會先判斷 Android 版本是多少,再來判斷硬體是否支援指紋辨識?
因為我們會用到 BiometricManager 這個類別,而這個類別只限定 API 29 以上(含)才能使用。
private fun canAuthenticateWithBiometrics(): Boolean? {
return if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
val fingerprintManagerCompat = FingerprintManagerCompat.from(this)
fingerprintManagerCompat.hasEnrolledFingerprints() && fingerprintManagerCompat.isHardwareDetected
} else {
val biometricManager = this.getSystemService(BiometricManager::class.java)
biometricManager?.let {
return availableCodes.contains(biometricManager.canAuthenticate())
} ?: false
}
}
這邊會有一個 Callback 必須覆寫,而透過這個 Callback 可以讓 BiometricPrompt 得知使用者是否指紋辨識成功或者多次辨識失敗以及使用者自己按下取消按鈕的監聽器。
val authenticationCallback = object : BiometricPrompt.AuthenticationCallback() {
override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult) {
super.onAuthenticationSucceeded(result)
Toast.makeText(applicationContext, getString(R.string.fingerprint_success), Toast.LENGTH_SHORT).show()
}
override fun onAuthenticationError(errorCode: Int, errString: CharSequence) {
super.onAuthenticationError(errorCode, errString)
Toast.makeText(applicationContext, errString.toString(), Toast.LENGTH_SHORT).show()
}
override fun onAuthenticationFailed() {
super.onAuthenticationFailed()
Toast.makeText(applicationContext, getString(R.string.fingerprint_fail), Toast.LENGTH_SHORT).show()
}
}
接下來要使用 Android 官方提供的 BiometricPrompt 類別的操作方法。
private fun showBiometricPrompt() {
//...
val mBiometricPrompt = BiometricPrompt(this, mainExecutor, authenticationCallback)
val promptInfo = BiometricPrompt.PromptInfo.Builder()
.setDescription(getString(R.string.plz_input_ur_fingerprint))
.setTitle(getString(R.string.fingerprint))
.setNegativeButtonText(getString(R.string.cancel))
.build()
mBiometricPrompt.authenticate(promptInfo)
}
結果如下圖所示。
這樣一來你就會發現按下 Button 後會跳出一個對話框幫你處理好任何指紋相關辨識,這樣就是一個簡易版的指紋辨識器了。