Android指紋識別程奠,看這一篇就夠了


在Android6.0(Api23)的時候丈牢,Android系統(tǒng)加入了指紋識別的api接口,即FingerprintManager瞄沙,定義了最基礎(chǔ)的指紋識別接口己沛。不過,在AndroidP(Api28)的時候距境,官方不再推薦使用申尼,做了@Deprecated處理。

后來肮疗,在support v4庫中添加了FingerprintManagerCompat類,我看了他的源碼扒接,其實就是對FingerprintManager做了一定的封裝伪货,比如做了對SDK版本的判斷、對于加密部分的處理等等钾怔,其本質(zhì)還是在用FingerprintManager來實現(xiàn)指紋識別功能碱呼。

到了AndroidP,FingerprintManager就正式退役了宗侦,系統(tǒng)新增了BiometricPrompt接口愚臀,從接口名字'生物識別'也能看出來,今后的安全驗證功能矾利,將不會局限于指紋了姑裂,應(yīng)該還會加入面部識別等等。

下面就通過我寫的一個demo男旗,展開來介紹一下FingerprintManager以及BiometricPrompt舶斧。

一、公共部分:

1察皇、總的來說茴厉,我們寫一個Manager類,類的內(nèi)部通過Api版本的判斷什荣,來分別實現(xiàn)Api23和Api28的適配


分別根據(jù)Api版本來實例化兩個類

2矾缓、其中,判斷版本號的辦法是:


判斷版本號

3稻爬、其次嗜闻,我們聲明了一個接口IBiometricPromptImpl,Api28和Api23的實例都要繼承他


接口

3桅锄、對于系統(tǒng)是否支持指紋識別的判斷:


四個判斷一起來做出最后的判斷

demo中的表現(xiàn)

分別說明一下判斷的細(xì)節(jié):

isAboveApi23():上面已經(jīng)說過了泞辐;
isHardwareDetected(): 這是用來判斷系統(tǒng)硬件是否支持指紋識別笔横,這里也是分情況判斷,但是AndroidP還不知道用什么確切的辦法來判斷咐吼,所以暫時用與AndroidM一樣的方式吹缔。Api23的具體實現(xiàn)在實現(xiàn)類中,后續(xù)你會看到

isHardwareDetected()

hasEnrolledFingerprints():這個方法是用來判斷你的設(shè)備在系統(tǒng)設(shè)置里面是否設(shè)置了指紋锯茄。
如果用戶沒有設(shè)置厢塘,這時候你可以引導(dǎo)他去設(shè)置。不過肌幽,我查了一下晚碾,各個廠家的設(shè)置指紋的頁面Activity名都不是統(tǒng)一的,所以這里要一一做適配能累成狗喂急。所以如果要引導(dǎo)的話格嘁,引導(dǎo)到安全設(shè)置頁面就可以了,安全設(shè)置頁面系統(tǒng)有統(tǒng)一的Intent廊移,是【Settings.ACTION_SECURITY_SETTINGS】糕簿。

hasEnrolledFingerprints()

isKeyguardSecure():這個方法是判斷系統(tǒng)有沒有設(shè)置鎖屏。
這個方法我認(rèn)為是個雞肋狡孔,因為現(xiàn)在如果你設(shè)置了指紋的話懂诗,肯定要讓你先設(shè)置一種密碼(PIN/Password/Pattern),那么鎖屏肯定也就隨之設(shè)置了苗膝,不理解為啥還要判斷一下這個殃恒。。辱揭。

isKeyguardSecure()

二离唐、BiometricPromptApi23: 針對Api23~Api27的部分

1、authenticate()

在看BiometricPromptApi23.java里面的內(nèi)容之前问窃,我們先需要了解一下指紋識別的關(guān)鍵方法:authenticate()侯繁。

authenticate方法

上圖是google的api文檔中的描述,現(xiàn)在我們挨個解釋一下這些參數(shù)都是什么:
①. crypto這是一個加密類的對象泡躯,指紋掃描器會使用這個對象來判斷認(rèn)證結(jié)果的合法性贮竟。這個對象可以是null,但是這樣的話较剃,就意味這app無條件信任認(rèn)證的結(jié)果咕别,雖然從理論上這個過程可能被攻擊,數(shù)據(jù)可以被篡改写穴,這是app在這種情況下必須承擔(dān)的風(fēng)險惰拱。因此,建議這個參數(shù)不要置為null啊送。這個類的實例化有點麻煩偿短,主要使用javax的security接口實現(xiàn)欣孤,后面我的demo程序中會給出一個helper類(CryptoObjectHelper.java),這個類封裝內(nèi)部實現(xiàn)的邏輯昔逗,開發(fā)者可以直接使用我的類簡化實例化的過程降传。
②. cancel這個是CancellationSignal類的一個對象,這個對象用來在指紋識別器掃描用戶指紋的是時候取消當(dāng)前的掃描操作勾怒,如果不取消的話婆排,那么指紋掃描器會移植掃描直到超時(一般為30s,取決于具體的廠商實現(xiàn))笔链,這樣的話就會比較耗電段只。建議這個參數(shù)不要置為null。
③. flags 標(biāo)識位鉴扫,根據(jù)上圖的文檔描述赞枕,這個位暫時應(yīng)該為0,這個標(biāo)志位應(yīng)該是保留將來使用的坪创。
④.callback這個是FingerprintManager.AuthenticationCallback類的對象炕婶,這個是這個接口中除了第一個參數(shù)之外最重要的參數(shù)了,稍后我們詳細(xì)來介紹误堡。這個參數(shù)不能為NULL古话。
⑤. handler 這是Handler類的對象雏吭,如果這個參數(shù)不為null的話锁施,那么FingerprintManager將會使用這個handler中的looper來處理來自指紋識別硬件的消息。通常來講杖们,開發(fā)這不用提供這個參數(shù)悉抵,可以直接置為null,因為FingerprintManager會默認(rèn)使用app的main looper來處理摘完。

2姥饰、指紋認(rèn)證之后的回調(diào)方法

這里就要介紹的是上面提到的FingerprintManager.AuthenticationCallback了,因為掃描指紋和認(rèn)證的過程都是在另外一個進(jìn)程中完成的孝治,所以我們需要采取異步的方式列粪,等操作完成之后,讓系統(tǒng)回調(diào)給我們谈飒,回調(diào)方法就是AuthenticationCallback類中的4個方法了

四個回調(diào)方法

下面我們簡要介紹一下這些接口的含義:
①. OnAuthenticationError(int errorCode, ICharSequence errString) 這個接口會再系統(tǒng)指紋認(rèn)證出現(xiàn)不可恢復(fù)的錯誤的時候才會調(diào)用岂座,并且參數(shù)errorCode就給出了錯誤碼,標(biāo)識了錯誤的原因杭措。
在AndroidP以前费什,這個方法回調(diào)回來之后,指紋識別sensor將會被關(guān)閉手素,也就是說鸳址,你再把手指放在指紋硬件上瘩蚪,將不會有反應(yīng)了。這時候你需要提示用戶關(guān)閉指紋識別彈窗稿黍,或改用密碼支付等等
什么情況下會回調(diào)error錯誤呢疹瘦?比如,連續(xù)識別錯誤5次指紋闻察、指紋硬件不可用等等拱礁。
②. OnAuthenticationFailed()這個接口會在系統(tǒng)指紋認(rèn)證失敗的情況的下才會回調(diào)。注意這里的認(rèn)證失敗和上面的認(rèn)證錯誤是不一樣的辕漂,雖然結(jié)果都是不能認(rèn)證呢灶。認(rèn)證失敗是指所有的信息都采集完整,并且沒有任何異常钉嘹,但是這個指紋和之前注冊的指紋是不相符的鸯乃;但是認(rèn)證錯誤是指在采集或者認(rèn)證的過程中出現(xiàn)了錯誤,比如指紋傳感器工作異常等跋涣。也就是說認(rèn)證失敗是一個可以預(yù)期的正常情況缨睡,而認(rèn)證錯誤是不可預(yù)期的異常情況。
③.OnAuthenticationHelp(int helpMsgId, ICharSequence helpString)上面的認(rèn)證失敗是認(rèn)證過程中的一個異常情況陈辱,我們說那種情況是因為出現(xiàn)了不可恢復(fù)的錯誤奖年,而我們這里的OnAuthenticationHelp方法是出現(xiàn)了可以回復(fù)的異常才會調(diào)用的。什么是可以恢復(fù)的異常呢沛贪?一個常見的例子就是:手指移動太快陋守,當(dāng)我們把手指放到傳感器上的時候,如果我們很快地將手指移走的話利赋,那么指紋傳感器可能只采集了部分的信息水评,因此認(rèn)證會失敗。但是這個錯誤是可以恢復(fù)的媚送,因此只要提示用戶再次按下指紋中燥,并且不要太快移走就可以解決。
④. OnAuthenticationSucceeded(FingerprintManagerCompati.AuthenticationResult result)這個接口會在認(rèn)證成功之后回調(diào)塘偎。我們可以在這個方法中提示用戶認(rèn)證成功疗涉。這里需要說明一下,如果我們上面在調(diào)用authenticate的時候吟秩,我們的CryptoObject不是null的話咱扣,那么我們在這個方法中可以通過AuthenticationResult來獲得Cypher對象然后調(diào)用它的doFinal方法。doFinal方法會檢查結(jié)果是不是會攔截或者篡改過峰尝,如果是的話會拋出一個異常偏窝。當(dāng)我們發(fā)現(xiàn)這些異常的時候都應(yīng)該將認(rèn)證當(dāng)做是失敗來來處理,為了安全建議大家都這么做。

好了祭往,下面來看看我的demo里的實現(xiàn)



這個authenticate方法是重寫了IBiometricPromptImpl接口中的方法伦意,重要的部分我已經(jīng)加了注釋,剩下的應(yīng)該能看懂了吧硼补,不懂的可以在評論中問~~【手動笑臉?】


實現(xiàn)了指紋識別的回調(diào)類

打開dialog驮肉,等待識別

識別出錯了

識別成功,之后自動關(guān)閉dialog

下面是兩個判斷方法的實現(xiàn)


判斷是否硬件支持和是否設(shè)置了指紋

三已骇、BiometricPromptApi28: 針對Api28及以后的平臺

在AndroidP中离钝,原來的fingerprintManager將被BiometricPrompt類替換,Google旨在統(tǒng)一生物識別的方式(雖然目前api中還沒有看到虹膜褪储、面部識別等)卵渴,包括UI,UI也不允許自定義了鲤竹,必須使用BiometricPrompt.Builder來創(chuàng)建對話框浪读,其中可以自定義title、subtitle辛藻、description和一個NegativeButton(也就是cancel鍵)碘橘。

AndroidP中系統(tǒng)對話框的表現(xiàn)

創(chuàng)建對話框

只有一個NegativeButton,這個很尷尬吱肌,意思是只能有button存在界面上痘拆,如果我想加個UsePassword的button,只能把這個cancel鍵給改掉氮墨。纺蛆。。(不過勇边,大家放心犹撒,雖然AndroidP的source還沒有放出來折联,不過粒褒,我讓老同事幫忙找了一分BiometricPrompt的源碼,里面還是有一個PositiveButton的诚镰,只不過api應(yīng)該還沒有放出來)

下面來看看實現(xiàn)代碼:
構(gòu)造方法奕坟,創(chuàng)建signature對象(對于加密這塊理解的不好,哪位大神可以給普及普及)


構(gòu)造方法

跟Api23很像清笨,實現(xiàn)authenticate方法


authenticate方法

回調(diào)
回調(diào)方法

附上源碼:有問題可以探討:https://github.com/gaoyangcr7/BiometricPromptDemo

常見問題:

1月杉,報錯 java.io.IOException: Failed to find byte code for android/hardware/biometrics/BiometricPrompt$AuthenticationCallback

去設(shè)置里把InstantRun關(guān)掉就好了

2,報錯 java.lang.RuntimeException: java.security.InvalidAlgorithmParameterException: java.lang.IllegalStateException: At least one fingerprint must be enrolled to create keys requiring user authentication for every use at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2913)
  1. 這個異常不是模擬器上才出現(xiàn)的抠艾,真機(jī)也會苛萎,和設(shè)備無關(guān),懷疑是谷歌 API 的坑
  2. 我的做法是catch住異常,友好提示用戶暫不支持指紋腌歉,引導(dǎo)用戶使用其他的驗證方式
  3. 備用做法是:直接使用無密鑰驗證蛙酪,但是有一定的安全風(fēng)險,目前在觀察線上用戶出現(xiàn)頻率翘盖,再考慮是否用備用方案桂塞。
1,小米6馍驯、6X手機(jī)上點擊“Turn On Identification”的時候會先走一遍onAuthenticationHelp阁危,helpCode=1021,helpString為空

應(yīng)該是MIUI自行修改了底層時間汰瘫,可以嘗試晚一點調(diào)用authenticate方法(沒試驗過狂打,主要手邊沒小米手機(jī))

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市混弥,隨后出現(xiàn)的幾起案子菱父,更是在濱河造成了極大的恐慌,老刑警劉巖剑逃,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件浙宜,死亡現(xiàn)場離奇詭異,居然都是意外死亡蛹磺,警方通過查閱死者的電腦和手機(jī)粟瞬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來萤捆,“玉大人裙品,你說我怎么就攤上這事∷谆颍” “怎么了市怎?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長辛慰。 經(jīng)常有香客問我区匠,道長,這世上最難降的妖魔是什么帅腌? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任驰弄,我火速辦了婚禮,結(jié)果婚禮上速客,老公的妹妹穿的比我還像新娘戚篙。我一直安慰自己,他們只是感情好溺职,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布岔擂。 她就那樣靜靜地躺著位喂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪乱灵。 梳的紋絲不亂的頭發(fā)上忆某,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機(jī)與錄音阔蛉,去河邊找鬼弃舒。 笑死,一個胖子當(dāng)著我的面吹牛状原,可吹牛的內(nèi)容都是我干的聋呢。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼颠区,長吁一口氣:“原來是場噩夢啊……” “哼削锰!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起毕莱,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤器贩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后朋截,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蛹稍,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年部服,在試婚紗的時候發(fā)現(xiàn)自己被綠了唆姐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡廓八,死狀恐怖奉芦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情剧蹂,我是刑警寧澤声功,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站宠叼,受9級特大地震影響芙贫,放射性物質(zhì)發(fā)生泄漏丈莺。R本人自食惡果不足惜眶根,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一壹无、第九天 我趴在偏房一處隱蔽的房頂上張望发钝。 院中可真熱鬧哪廓,春花似錦缘揪、人聲如沸博烂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春丈咐,著一層夾襖步出監(jiān)牢的瞬間瑞眼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工棵逊, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留伤疙,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓辆影,卻偏偏與公主長得像徒像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蛙讥,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 好久沒寫文章了锯蛀,最近也比較偷懶,今天繼續(xù)討論我實際開發(fā)中遇到的需求次慢,那就是關(guān)于APP解鎖旁涤,大家都知道。現(xiàn)在越來越多...
    青蛙要fly閱讀 3,051評論 2 26
  • 一迫像、 指紋識別接口從Android 6.0開始劈愚,Android系統(tǒng)加上了對指紋識別的支持。所有指紋識別的接口都在...
    Qi0907閱讀 1,416評論 0 1
  • 指紋識別-Android @(Android進(jìn)階資料)[Android, 學(xué)習(xí), 讀書筆記, Markdown]指...
    辰曦小雨閱讀 1,591評論 3 6
  • 最近項目中添加了一個新的登錄方式:指紋識別闻妓。好巧不巧這塊分給了我造虎,然后一頓研究。下面想把一些實現(xiàn)的代碼貼出來做個筆...
    SHERLOCKvv閱讀 23,686評論 6 28
  • 中午的時候媽媽發(fā)了一條朋友圈纷闺,是剛做好的燜面算凿,想起來上次吃燜面還是寒假過年回家的時候,心中略數(shù)了一下大概還要三個...
    余余不吃魚閱讀 654評論 0 2