基于android7.1.1第一次指紋設(shè)置必須安全解鎖分析

環(huán)境:ubuntu14.04
基于高通的android7.1.1代碼(同aosp差別不大)

1.現(xiàn)象:第一次直接設(shè)置指紋后,然后鎖屏,不能夠直接使用指紋進(jìn)行解鎖而是提示使用密碼,pin碼,圖案等安全鎖屏方式才能進(jìn)行解鎖?

分析:手機(jī)的解鎖方式分為pin碼,圖案,密碼等,從KeyguardSecurityModel類(lèi)中即可看出來(lái):

    /**
     * The different types of security available.
     * @see KeyguardSecurityContainer#showSecurityScreen
     */
    public enum SecurityMode {
        Invalid, // NULL state
        None, // No security enabled
        Pattern, // Unlock by drawing a pattern.
        Password, // Unlock by entering an alphanumeric password
        PIN, // Strictly numeric password
        SimPin, // Unlock by entering a sim pin.
        SimPuk // Unlock by entering a sim puk
    }

指紋等生物解鎖密碼等只是一種輔助用來(lái)解鎖的手段,不能單獨(dú)存在,而且指紋注冊(cè)時(shí)必須要基于安全鎖屏方式來(lái)獲取Token才能注冊(cè)成功.

查看代碼ViewMediatorCallback接口為:

    /**
     * @return one of the reasons why the bouncer needs to be shown right now and the user can't use
     *         his normal unlock method like fingerprint or trust agents. See
     *         {@link KeyguardSecurityView#PROMPT_REASON_NONE},
     *         {@link KeyguardSecurityView#PROMPT_REASON_RESTART} and
     *         {@link KeyguardSecurityView#PROMPT_REASON_TIMEOUT}.
     */
    int getBouncerPromptReason();

KeyguardViewMediator中實(shí)現(xiàn)了此接口方法:

        @Override
        public int getBouncerPromptReason() {
            int currentUser = ActivityManager.getCurrentUser();
            boolean trust = mTrustManager.isTrustUsuallyManaged(currentUser);
            boolean fingerprint = mUpdateMonitor.isUnlockWithFingerprintPossible(currentUser);
            boolean any = trust || fingerprint;
            KeyguardUpdateMonitor.StrongAuthTracker strongAuthTracker =
                    mUpdateMonitor.getStrongAuthTracker();
            int strongAuth = strongAuthTracker.getStrongAuthForUser(currentUser);
            if (any && !strongAuthTracker.hasUserAuthenticatedSinceBoot()) {
                //第一次重啟機(jī)器
                return KeyguardSecurityView.PROMPT_REASON_RESTART;
            } else if (fingerprint && mUpdateMonitor.hasFingerprintUnlockTimedOut(currentUser)) {
                //所需要查看問(wèn)題所在,當(dāng)之前沒(méi)有安全解鎖方式解鎖成功時(shí),指紋第一次被設(shè)置時(shí)不能使用指紋解鎖
                return KeyguardSecurityView.PROMPT_REASON_TIMEOUT;
            } else if (any && (strongAuth & STRONG_AUTH_REQUIRED_AFTER_DPM_LOCK_NOW) != 0) {
                return KeyguardSecurityView.PROMPT_REASON_DEVICE_ADMIN;
            } else if (trust && (strongAuth & SOME_AUTH_REQUIRED_AFTER_USER_REQUEST) != 0) {
                //用戶(hù)指紋和安全解鎖方式都可以正常使用所提示的信息
                return KeyguardSecurityView.PROMPT_REASON_USER_REQUEST;
            } else if (any && (strongAuth & STRONG_AUTH_REQUIRED_AFTER_LOCKOUT) != 0) {
                return KeyguardSecurityView.PROMPT_REASON_AFTER_LOCKOUT;
            }
            return KeyguardSecurityView.PROMPT_REASON_NONE;
        }

ViewMediatorCallback實(shí)例化傳遞給StatusBarKeyguardViewManager,然后在傳遞給KeyguardBouncer

mStatusBarKeyguardViewManager =
                SystemUIFactory.getInstance().createStatusBarKeyguardViewManager(mContext,
                        mViewMediatorCallback, mLockPatternUtils);
mBouncer = SystemUIFactory.getInstance().createKeyguardBouncer(mContext,
                mViewMediatorCallback, mLockPatternUtils, mStatusBarWindowManager, container);

接下來(lái)就需要查看在KeyguardBouncer中如何調(diào)用此方法了,查看代碼:
有兩個(gè)地方:

                public void onStrongAuthStateChanged(int userId) {
                    //跟蹤了相關(guān)代碼,這個(gè)是在解鎖完成之后才會(huì)調(diào)用觸發(fā)
                    mBouncerPromptReason = mCallback.getBouncerPromptReason();
                }
    public void prepare() {
        boolean wasInitialized = mRoot != null;
        ensureView();
        if (wasInitialized) {
            //每次準(zhǔn)備解鎖界面時(shí)才會(huì)調(diào)用此方法,就是這個(gè)問(wèn)題所需要的時(shí)機(jī)
            mKeyguardView.showPrimarySecurityScreen();
        }
        mBouncerPromptReason = mCallback.getBouncerPromptReason();
    }

鎖屏準(zhǔn)備解鎖界面時(shí)會(huì)調(diào)用上述邏輯,那么還是要在具體實(shí)現(xiàn)看,具體實(shí)現(xiàn)類(lèi),為什么會(huì)走入對(duì)應(yīng)分支,也就是

                else if (fingerprint && mUpdateMonitor.hasFingerprintUnlockTimedOut(currentUser)) {
                //所需要查看問(wèn)題所在,當(dāng)之前沒(méi)有安全解鎖方式解鎖成功時(shí),指紋第一次被設(shè)置時(shí)不能使用指紋解鎖
                return KeyguardSecurityView.PROMPT_REASON_TIMEOUT;
                }
/**
     * @return true if the user hasn't use strong authentication (pattern, PIN, password) since a
     *         while and thus can't unlock with fingerprint, false otherwise
     */
    public boolean hasFingerprintUnlockTimedOut(int userId) {
        //通過(guò)判斷這個(gè)集合里面是否有當(dāng)前用戶(hù)ID,需要查看的就是添加到集合的時(shí)機(jī)
        return !mStrongAuthNotTimedOut.contains(userId);
    }

查看添加集合的時(shí)機(jī)為:

    //
   public void reportSuccessfulStrongAuthUnlockAttempt() {
        mStrongAuthNotTimedOut.add(sCurrentUser);
        scheduleStrongAuthTimeout();
        if (mFpm != null) {
            byte[] token = null; /* TODO: pass real auth token once fp HAL supports it */
            mFpm.resetTimeout(token);
        }
    }

此方法是在解鎖完成之后會(huì)調(diào)用的

        @Override
        public void keyguardDone(boolean strongAuth) {
            if (!mKeyguardDonePending) {
                KeyguardViewMediator.this.keyguardDone(true /* authenticated */);
            }
            if (strongAuth) {
                mUpdateMonitor.reportSuccessfulStrongAuthUnlockAttempt();
            }
        }

這樣我們就清楚了整個(gè)流程,只有在使用了安全的解鎖方式解鎖之后才會(huì)在集合中添加當(dāng)前用戶(hù)ID,代表之后設(shè)置指紋可以正常使用,如果在之前沒(méi)有使用過(guò)安全的解鎖方式,那么就不可以直接使用生物信息解鎖,必須要使用安全解鎖,這樣在代碼里會(huì)添加當(dāng)前用戶(hù)ID,代表用安全解鎖方式認(rèn)證完畢,所以可以使用指紋了.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末浦妄,一起剝皮案震驚了整個(gè)濱河市顽馋,隨后出現(xiàn)的幾起案子品嚣,更是在濱河造成了極大的恐慌,老刑警劉巖斋陪,帶你破解...
    沈念sama閱讀 212,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異置吓,居然都是意外死亡无虚,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)衍锚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)友题,“玉大人,你說(shuō)我怎么就攤上這事戴质《然拢” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,369評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵告匠,是天一觀的道長(zhǎng)戈抄。 經(jīng)常有香客問(wèn)我,道長(zhǎng)后专,這世上最難降的妖魔是什么划鸽? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,799評(píng)論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上裸诽,老公的妹妹穿的比我還像新娘嫂用。我一直安慰自己,他們只是感情好丈冬,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布尸折。 她就那樣靜靜地躺著,像睡著了一般殷蛇。 火紅的嫁衣襯著肌膚如雪实夹。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 50,096評(píng)論 1 291
  • 那天粒梦,我揣著相機(jī)與錄音亮航,去河邊找鬼。 笑死匀们,一個(gè)胖子當(dāng)著我的面吹牛缴淋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播泄朴,決...
    沈念sama閱讀 39,159評(píng)論 3 411
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼重抖,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了祖灰?” 一聲冷哼從身側(cè)響起钟沛,我...
    開(kāi)封第一講書(shū)人閱讀 37,917評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎局扶,沒(méi)想到半個(gè)月后恨统,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡三妈,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評(píng)論 2 327
  • 正文 我和宋清朗相戀三年畜埋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片畴蒲。...
    茶點(diǎn)故事閱讀 38,814評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡悠鞍,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出模燥,到底是詐尸還是另有隱情咖祭,我是刑警寧澤,帶...
    沈念sama閱讀 34,509評(píng)論 4 334
  • 正文 年R本政府宣布涧窒,位于F島的核電站心肪,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏纠吴。R本人自食惡果不足惜硬鞍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧固该,春花似錦锅减、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至桦沉,卻和暖如春每瞒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背纯露。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,123評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工剿骨, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人埠褪。 一個(gè)月前我還...
    沈念sama閱讀 46,641評(píng)論 2 362
  • 正文 我出身青樓浓利,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親钞速。 傳聞我的和親對(duì)象是個(gè)殘疾皇子贷掖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評(píng)論 2 351

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