前言:
這兩天項(xiàng)目中增加指紋解鎖功能,so現(xiàn)在把總結(jié)一下,再熟悉一下绊袋。
本文純是自己的理解,如果哪里有寫的不對(duì)的地方歡迎大家指出铸鹰,一起前進(jìn)愤炸。
解釋:
指紋是在android6.0系統(tǒng)新增加的功能,最小api等級(jí)要求23掉奄。
原理(流程):
首先驗(yàn)證你的密碼规个,密碼驗(yàn)證通過之后,開始驗(yàn)證指紋姓建,這里的要驗(yàn)證的指紋是指你手機(jī)上錄入的用于解鎖屏幕的指紋(前提你已經(jīng)錄入了指紋诞仓,開啟了密碼鎖屏),當(dāng)你沒有錄入指紋的時(shí)候系統(tǒng)會(huì)回調(diào)速兔,提醒你(提示性內(nèi)容可以自己設(shè)置)墅拭。
使用
1、適配:由于Android機(jī)碎片化太嚴(yán)重涣狗,不同的手機(jī)廠商給配置的也不一樣谍婉,所以我就是一竿子敲死的做法:
a.這個(gè)方法比較粗魯舒憾,但是符合google公司的策略(上代碼)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
Log.i("info", "手機(jī)支持指紋識(shí)別");
} else {
Log.i("info", "手機(jī)不支持指紋識(shí)別");
}
b.(上圖片,拿來(lái)主義)
2穗熬、調(diào)用:
Google提供的和指紋識(shí)別有關(guān)的類不多镀迂,主要是FingerprintManager,大家可以看一下官方文檔:
https://developer.android.google.cn/reference/android/hardware/fingerprint/FingerprintManager.html唤蔗,
網(wǎng)上還有說(shuō)可以使用FingerprintManagerCompat探遵,這個(gè)是V4包下的,他倆用法一樣妓柜,我只以一種為例箱季。
這里我主要說(shuō)的是怎么使用。
創(chuàng)建一個(gè)對(duì)象棍掐,然后調(diào)用對(duì)應(yīng)的方法藏雏。
FingerprintManager mFingerprintManager=(FingerprintManager)mActivity.getSystemService(Context.FINGERPRINT_SERVICE);
//FingerprintManagerCompat mFingerprintManger= FingerprintManagerCompat.from(mActivity);
接下來(lái)就是調(diào)用識(shí)別的方法:
CancellationSignal cancellationSignal=new CancellationSignal ();//取消的對(duì)象
mFingerprintManger.authenticate(null, 0, cancellationSignal, new MyFingerDiscentListener(), null);
這個(gè)方法有5個(gè)參數(shù):
第1個(gè)參數(shù)是指密鑰,可以為null作煌;
第2個(gè)參數(shù)是flag掘殴,一個(gè)標(biāo)記,一般寫成0最疆;
第3個(gè)參數(shù)是指紋識(shí)別取消的對(duì)象杯巨,用于手動(dòng)取消指紋識(shí)別蚤告,不需要手動(dòng)取消的時(shí)候可直接寫null努酸;
第4個(gè)參數(shù)是指紋識(shí)別回調(diào)對(duì)象,一個(gè)類繼承FingerprintManager.AuthenticationCallback杜恰,下面會(huì)有詳細(xì)解釋获诈;
第5個(gè)參數(shù)是一個(gè)handler對(duì)象,默認(rèn)是在程序主線程的handler中心褐。
CancellationSignal:手動(dòng)取消識(shí)別對(duì)象
if (cancellationSignal != null) {
cancellationSignal.cancel();
cancellationSignal = null;
}
3舔涎、識(shí)別的回調(diào):主要是提示識(shí)別成功還是失敗(FingerprintManager.AuthenticationCallback),具體解釋已經(jīng)寫成注釋:(上代碼)
private class MyFingerDiscentListener extends FingerprintManagerCompat.AuthenticationCallback {
@Override
public void onAuthenticationError(int errMsgId, CharSequence errString) {
super.onAuthenticationError(errMsgId, errString);
if (errMsgId == 5) {//取消識(shí)別
} else if (errMsgId == 7) {
Toast.makeText(mActivity, "操作過于頻繁逗爹,請(qǐng)稍后重試", Toast.LENGTH_SHORT).show();
if (cancellationSignal != null) {
cancellationSignal.cancel();
cancellationSignal = null;
}
}
}
@Override
public void onAuthenticationSucceeded(FingerprintManagerCompat.AuthenticationResult result) {
super.onAuthenticationSucceeded(result);
Toast.makeText(mActivity, "指紋識(shí)別成功", Toast.LENGTH_SHORT).show();
}
@Override
public void onAuthenticationFailed() {
super.onAuthenticationFailed();
Toast.makeText(mActivity, "指紋識(shí)別失敗", Toast.LENGTH_SHORT).show();
}
@Override
public void onAuthenticationHelp(int helpMsgId, CharSequence helpString) {
super.onAuthenticationHelp(helpMsgId, helpString);
}
}
強(qiáng)調(diào):google公司設(shè)置的識(shí)別允許失敗5次亡嫌,5次都失敗了以后errMsgId=7
指紋識(shí)別回調(diào)過程:
識(shí)別成功會(huì)走onAuthenticationSucceeded;
手動(dòng)取消識(shí)別會(huì)走onAuthenticationError掘而,此時(shí)errMsgId=5
前4次識(shí)別失敗時(shí)會(huì)走onAuthenticationFailed挟冠,第5次還是失敗時(shí)會(huì)走onAuthenticationError,此時(shí)errMsgId=7袍睡。
總結(jié)
指紋識(shí)別在開啟后一段時(shí)間內(nèi)(這段時(shí)間具體多長(zhǎng)還沒研究出來(lái))識(shí)別失敗的次數(shù)是累積的知染,比如:第一次開始指紋識(shí)別失敗了以后,按下返回鍵斑胜,點(diǎn)擊再次進(jìn)入該頁(yè)面進(jìn)行指紋識(shí)別控淡,此時(shí)當(dāng)失敗3次以后嫌吠,下一次識(shí)別失敗就會(huì)提示操作頻繁。
更細(xì)幾個(gè)方法:
//手機(jī)硬件是否支持指紋
private Boolean isHardwareDected() {
try {
return mFingerprintManger.isHardwareDetected();
} catch (Exception e) {
return false;
}
}
//是否錄入指紋掺炭,有些設(shè)備即使錄入指紋辫诅,但是沒有開啟鎖屏密碼的話此方法還是返回false
private Boolean isFingerOpen() {
try {
return mFingerprintManger.hasEnrolledFingerprints();
} catch (Exception e) {
return false;
}
}
//是否開始密碼鎖屏
private Boolean isOpenCloseScreen() {
try {
KeyguardManager mKeyguardManager= (KeyguardManager) mActivity.getSystemService(Context.KEYGUARD_SERVICE);
return mKeyguardManager.isKeyguardSecure();
} catch (Exception e) {
return false;
}
}