Android指紋支付 - android M / P 全適配

前言

先說一下為什么會發(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 鏈接

https://github.com/Likeyong/FingerManagerCompat

指紋支付已有方案

  • 使用微信開源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 的指紋識別彈窗,很簡單,你只需要:

  1. 繼承AFingerDialog類
  2. 在onCreateView中初始化你自己的布局
  3. 實現(xiàn)onSucceed()抠艾、onFailed()苛萎、onHelp()桨昙、onError()四個回調(diào)就好了检号,這四個回調(diào)建議只做UI相關(guān)操作,邏輯操作已經(jīng)在外部提供了回調(diào)接口蛙酪。

彈窗回調(diào)

  1. onSucceed :指紋識別成功齐苛,可以直接關(guān)閉彈窗
  2. onFailed : 當(dāng)識別的手指沒有注冊時回調(diào),但是可以繼續(xù)驗證
  3. onHelp : 指紋識別不對,會提示,手指不要大范圍移動等信息,可以繼續(xù)驗證
  4. 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'

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市桂塞,隨后出現(xiàn)的幾起案子凹蜂,更是在濱河造成了極大的恐慌,老刑警劉巖阁危,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件玛痊,死亡現(xiàn)場離奇詭異,居然都是意外死亡狂打,警方通過查閱死者的電腦和手機擂煞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來趴乡,“玉大人对省,你說我怎么就攤上這事蝗拿。” “怎么了蒿涎?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵哀托,是天一觀的道長。 經(jīng)常有香客問我劳秋,道長仓手,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任俗批,我火速辦了婚禮俗或,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘岁忘。我一直安慰自己辛慰,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布干像。 她就那樣靜靜地躺著帅腌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪麻汰。 梳的紋絲不亂的頭發(fā)上速客,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天,我揣著相機與錄音五鲫,去河邊找鬼溺职。 笑死,一個胖子當(dāng)著我的面吹牛位喂,可吹牛的內(nèi)容都是我干的浪耘。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼塑崖,長吁一口氣:“原來是場噩夢啊……” “哼七冲!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起规婆,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤澜躺,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后抒蚜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體掘鄙,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年嗡髓,在試婚紗的時候發(fā)現(xiàn)自己被綠了操漠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡器贩,死狀恐怖颅夺,靈堂內(nèi)的尸體忽然破棺而出朋截,到底是詐尸還是另有隱情,我是刑警寧澤吧黄,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布部服,位于F島的核電站,受9級特大地震影響拗慨,放射性物質(zhì)發(fā)生泄漏廓八。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一赵抢、第九天 我趴在偏房一處隱蔽的房頂上張望剧蹂。 院中可真熱鬧,春花似錦烦却、人聲如沸宠叼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽冒冬。三九已至,卻和暖如春摩渺,著一層夾襖步出監(jiān)牢的瞬間简烤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工摇幻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留横侦,地道東北人。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓绰姻,卻偏偏與公主長得像枉侧,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子龙宏,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,927評論 2 355