前言
先說一下為什么會發(fā)布出這個庫吧杀怠。很多沒做過指紋相關(guān)功能肯定和我一開始一樣認(rèn)為:指紋支付很簡單官方封裝好的Api調(diào)用一下就好了椰憋,熟悉幾個Api的事情。但是呢赔退,這只是識別指紋熏矿,真正的指紋識別應(yīng)用設(shè)計很多問題。這里就以指紋支付應(yīng)用場景舉例离钝。
我們的期望:
(1)指紋支付可以和手指綁定票编,比和微信支付一樣:開啟時輸入一個指紋,每次支付的時候只能用當(dāng)時綁定的指紋支付
(2)如果上面的走不通的話卵渴,那就只能和招商銀行指紋登錄一樣:開啟指紋登錄時驗證指紋慧域,驗證通過之后,以后每次登錄都可以通過驗證輸入的指紋是否是錄入系統(tǒng)中的任何一個指紋浪读。 如果你開通指紋后昔榴,又在系統(tǒng)中錄入了新的指紋辛藻,下次用指紋登錄招商銀行的時候就會被提示指紋發(fā)生了變化。
重點
你不用關(guān)心版本適配,你不用關(guān)心任何接口,你只需要處理你自己業(yè)務(wù)就行.
本庫
api 'com.codersun:fingermanager:1.0.2'
- github 鏈接
指紋支付已有方案
- 使用微信開源Soter庫
? 這個方案的優(yōu)點就是穩(wěn),據(jù)說微信的指紋支付就是使用的這個方案,和國產(chǎn)設(shè)備廠商合作的.可以定位的具體的哪個手指,可以獲取到指紋Id. 不足之處就是不支持華為手機和國外部分廠商(沒有和Soter合作的). 雖然微信客戶端是支持華為指紋的.但是這個框架是暫時不支持的.(很久之前就說要支持,截至目前仍未支持)這其中的恩怨,大家百度一下就可以了解了.反正我是支持華為的
- 使用系統(tǒng)官方Api
?? 優(yōu)點:支持所有android 6.0 以上的指紋設(shè)備(招商銀行80%可能性使用的就是這個方案)
?? 缺點:
?? ?? ?? 1. 不能獲取指紋Id,不能和手指綁定,同能通過判斷指紋庫是否變化保證安全
?? ?? ?? 2. 需要針對android 6.0 和android 9.0 適配 : android 9.0 以下需要自己實現(xiàn)指紋識別彈窗樣式 ,但是android 9.0 開始統(tǒng)一由系統(tǒng)彈窗實現(xiàn)(不同廠商可能還不一樣)<BR><BR>
自己實現(xiàn)的坑
這里列一下通過官方api實現(xiàn)招商銀行的指紋登錄會有那些問題互订,也就是本庫的有點:
1. 要判斷手機指紋庫是否發(fā)生了變化
2. 需要適配android版本吱肌,在android版本大于6.0 小于9.0 的情況下要自己實現(xiàn)指紋識別彈窗。在android P上要使用最新Api調(diào)用指紋識別統(tǒng)一彈窗
3. 因為指紋識別回調(diào)中的識別失敗會在兩種情況下回調(diào)仰禽,分別是:真的指紋識別失敗了氮墨,還有一種是用戶取消了指紋識別這時候也會回調(diào)指紋識別失敗。所以要對兩種情況進行區(qū)分吐葵,并且官方api并沒有直接的借口规揪。
指紋識別api解讀
這里我就不寫了,因為有人在官方api解讀上已經(jīng)寫的非常好了温峭,下面的鏈接寫了怎么使用api猛铅,寫的非常詳細(xì),以至于在我寫好我自己的庫之后再看他的文章還是覺得很有收獲凤藏。但是他的庫貌似也沒解決上面的三個問題(手動狗頭)
https://mp.weixin.qq.com/s/IhNdod3rBmhkYwJ6XuTIYg
真槍實彈
使用這個庫奸忽,通過下面這段代碼,你可以實現(xiàn)上面所說的所有功能:
1. 檢查設(shè)備是否支持指紋:分為三種支持揖庄,分別是(1)設(shè)備沒有指紋識別器 (2)設(shè)備有指紋識別器但是沒有指紋數(shù)據(jù)(3)設(shè)備有識別器并且有指紋數(shù)據(jù)栗菜,可以進行指紋驗證
2. 相應(yīng)手機指紋庫數(shù)據(jù)發(fā)生變化的情況
3. 能夠?qū)θ∠讣y識別和指紋識別失敗分別進行處理
4. 針對android M 、P 進行識別
switch (FingerManager.checkSupport(MainActivity.this))
{
case DEVICE_UNSUPPORTED:
showToast("您的設(shè)備不支持指紋");
break;
case SUPPORT_WITHOUT_DATA:
showToast("請在系統(tǒng)錄入指紋后再驗證");
break;
case SUPPORT:
FingerManager.build().setApplication(getApplication())
.setTitle("指紋驗證")
.setDes("請按下指紋")
.setNegativeText("取消")
.setFingerDialogApi23(new MyFingerDialog())
.setFingerCheckCallback(new SimpleFingerCheckCallback()
{
@Override
public void onSucceed()
{
showToast("驗證成功");
}
@Override
public void onError(String error)
{
showToast("驗證失敗");
}
@Override
public void onCancel()
{
showToast("您取消了識別");
}
})
.setFingerChangeCallback(new AonFingerChangeCallback()
{
@Override
protected void onFingerDataChange()
{
showToast("指紋數(shù)據(jù)發(fā)生了變化");
}
})
.create()
.startListener(MainActivity.this);
break;
}
自定義android M 彈窗
如果你想自定義android M 的指紋識別彈窗,很簡單,你只需要:
- 繼承AFingerDialog類
- 在onCreateView中初始化你自己的布局
- 實現(xiàn)onSucceed()抠艾、onFailed()苛萎、onHelp()桨昙、onError()四個回調(diào)就好了检号,這四個回調(diào)建議只做UI相關(guān)操作,邏輯操作已經(jīng)在外部提供了回調(diào)接口蛙酪。
彈窗回調(diào)
- onSucceed :指紋識別成功齐苛,可以直接關(guān)閉彈窗
- onFailed : 當(dāng)識別的手指沒有注冊時回調(diào),但是可以繼續(xù)驗證
- onHelp : 指紋識別不對,會提示,手指不要大范圍移動等信息,可以繼續(xù)驗證
- onError :指紋識別徹底失敗,不能繼續(xù)驗證
一個指紋識別事件序列是這樣的:
開始識別 ---> (onHelp / onFaild) (0個或多個) ---> onSucceed / onError
代碼
public class MyFingerDialog extends AFingerDialog implements View.OnClickListener
{
private TextView titleTv;
private TextView desTv;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState)
{
super.onCreateView(inflater, container, savedInstanceState);
View view = inflater.inflate(R.layout.my_dialog_finger, null);
titleTv = view.findViewById(com.codersun.fingerprintcompat.R.id.finger_dialog_title_tv);
desTv = view.findViewById(com.codersun.fingerprintcompat.R.id.finger_dialog_des_tv);
TextView cancelTv = view.findViewById(com.codersun.fingerprintcompat.R.id.finger_dialog_cancel_tv);
cancelTv.setOnClickListener(this);
return view;
}
@Override
public void onSucceed()
{
dismiss();
}
@Override
public void onFailed()
{
titleTv.setText("我是失敗標(biāo)題,繼續(xù)驗證");
desTv.setText("連按個手指都不會,去屎吧");
}
@Override
public void onHelp(String help)
{
titleTv.setText("我是失敗標(biāo)題,繼續(xù)驗證");
desTv.setText("連按個手指都不會,去屎吧");
}
@Override
public void onError(String error)
{
titleTv.setText("客官,下次再來");
desTv.setText("這都能失敗,你還能干啥,不消失,代表我是自定義彈窗");
}
@Override
public void onCancelAuth()
{
}
@Override
public void onClick(View v)
{
dismiss();
}
}
// 調(diào)起指紋識別得時候,將自定義的彈窗設(shè)置進去,代碼如下,如果你不設(shè)置自定義彈窗會使用默認(rèn)的android M 彈窗
FingerManager.build().setApplication(getApplication())
.setTitle("指紋驗證")
.setDes("請按下指紋")
.setNegativeText("取消")
.setFingerDialogApi23(new MyFingerDialog())
.setFingerCheckCallback()
演示
android M
- 指紋識別成功
- 設(shè)備沒有指紋數(shù)據(jù)
- 指紋驗證失敗
- 取消指紋識別
- 自定義指紋識別彈窗
- 指紋數(shù)據(jù)發(fā)生了改變
android P
- 指紋識別成功
- 指紋識別失敗
- 指紋識別取消
- 指紋庫發(fā)生改變
使用方式
api 'com.codersun:fingermanager:1.0.2'