android6.0以後就提供了指紋識别功能,但是由于android手機被各大廠商弄的層次不齊,是以android的指紋識别使用的比較少,但是由于現在老的智能手機被淘汰的差不多了,新手機幾乎無一不支援指紋解鎖的,是以android也可以搞起指紋識别來了,使使用更友善。
指紋驗證的思路大概是這樣的:
- 1.裝置是否支援指紋識别
- 2.裝置是否處于安全保護中(有指紋識别的手機,在使用指紋識别的時候,還需要強制設定密碼解鎖,如果未設定的話是不許使用指紋識别的)
- 3.裝置是否已經注冊過指紋(如果使用者未使用過這個指紋技術,那麼隻能提示使用者到系統設定裡面去設定)
先看一張效果圖:

廢話不多說直接上代碼吧:
要想檢視google文檔的請點這裡
第一步:在AndroidManifest.xml中申明權限:
<uses-permission android:name="android.permission.USE_FINGERPRINT"/>
此權限不需要動态去申請,直接注冊就可以;關于哪些權限需要去動态申請可以檢視鴻洋大神的這篇部落格:
http://blog.csdn.net/lmj623565791/article/details/50709663
第二步:擷取指紋管理類:
//這種是使用系統服務,但是必須要在sdk為23以上版本才行
// FingerprintManager fingerprintManager = (FingerprintManager) getSystemService(Context.FINGERPRINT_SERVICE);
//這種使用的是v4的相容包,推薦使用這種
managerCompat = FingerprintManagerCompat.from(MyApplication.appContext);
public boolean checkIsFinger() {
//判斷目前手機版本
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// if (ActivityCompat.checkSelfPermission(MyApplication.appContext, Manifest.permission.USE_FINGERPRINT) != PackageManager.PERMISSION_GRANTED) {
// ToastUtils.getInstance().showToast("沒有指紋識别權限");
// return false;
// }
Log.e(TAG, "有指紋權限");
//判斷硬體是否支援指紋識别
if (!managerCompat.isHardwareDetected()) {
ToastUtils.getInstance().showToast("沒有指紋識别子產品");
return false;
}
Log.e(TAG, "有指紋子產品");
//判斷 是否開啟鎖屏密碼
if (!keyguardManager.isKeyguardSecure()) {
ToastUtils.getInstance().showToast("沒有開啟鎖屏密碼");
return false;
}
//判斷是否有指紋錄入
if (!managerCompat.hasEnrolledFingerprints()) {
ToastUtils.getInstance().showToast("沒有錄入指紋");
return false;
}
return true;
} else {
ToastUtils.getInstance().showToast("裝置系統版本太低不支援指紋識别");
return false;
}
}
/**
* 開始識别指紋
*
* @param listener
*/
public void callFingerPrint(final FingerRecognitionCallBack listener) {
authentFailedTimes = 0;
if (listener != null)
listener.onAuthenticationStart(); //開始指紋識别
cancellationSignal = new CancellationSignal(); //必須重新執行個體化,否則cancel 過一次就不能再使用了
managerCompat.authenticate(null, 0, cancellationSignal, new FingerprintManagerCompat.AuthenticationCallback() {
// 驗證出錯回調 指紋傳感器會關閉一段時間,在下次調用authenticate時,會出現禁用期(時間依廠商不同30,1分都有)
@Override
public void onAuthenticationError(int errMsgId, CharSequence errString) {
if (listener != null)
listener.onAuthenticationError(errMsgId, errString);
}
// 驗證失敗 指紋驗證失敗後,指紋傳感器不會立即關閉指紋驗證,系統會提供5次重試的機會,即調用5次onAuthenticationFailed後,才會調用onAuthenticationError
@Override
public void onAuthenticationFailed() {
authentFailedTimes++;
if (listener != null)
listener.onAuthenticationFailed(authentFailedTimes);
}
@Override
public void onAuthenticationHelp(int helpMsgId, CharSequence helpString) {//比如手指移動太快等情況
if (listener != null)
listener.onAuthenticationHelp(helpMsgId, helpString);
}
// 當驗證的指紋成功時會回調此函數,然後不再監聽指紋sensor
@Override
public void onAuthenticationSucceeded(FingerprintManagerCompat.AuthenticationResult result) {
if (listener != null)
listener.onAuthenticationSucceeded(result);
}
}, null);
}
if (FingerUnlockUtil.init().checkIsFinger()) {
final AlertDialog dia = localBuilder.show();
FingerUnlockUtil.init().callFingerPrint(new FingerRecognitionCallBackHelper() {
@Override
public void onAuthenticationError(int errMsgId, CharSequence errString) {
dia.dismiss();
ToastUtils.getInstance().showToast("驗證錯誤===" + String.valueOf(errString));
}
@Override
public void onAuthenticationFailed(int failedTimes) {
ToastUtils.getInstance().showToast("已經驗證錯誤===" + failedTimes + "次");
}
@Override
public void onAuthenticationHelp(int helpMsgId, CharSequence helpString) {//可以不用實作
ToastUtils.getInstance().showToast("驗證幫助===" + String.valueOf(helpString));
}
@Override
public void onAuthenticationSucceeded(FingerprintManagerCompat.AuthenticationResult result) {
dia.dismiss();
ToastUtils.getInstance().showToast("驗證成功===");
}
});
}
這裡就結束了,是不是很簡單呢,可以點選這裡下載下傳源碼:demo源碼