Android7.0 指紋framework流程及修改

回調(diào)流程

FingerprintService啟動(dòng)同時(shí)啟動(dòng)FingerprintDaemon并傳入核心回調(diào)接口——IFingerprintDaemonCallback(8.1是IBiometricsFingerprintClientCallback)
該接口用于向ClientMonitor的4大實(shí)現(xiàn)類分發(fā)回調(diào)事件东羹。

  • AuthenticationClient:指紋驗(yàn)證
  • EnrollClient:指紋錄入
  • EnumerateClient :
  • RemovalClient:指紋移除
1. IFingerprintDaemonCallback
  private IFingerprintDaemonCallback mDaemonCallback = new IFingerprintDaemonCallback.Stub() {

        @Override
        public void onEnrollResult(final long deviceId, final int fingerId, final int groupId,
                final int remaining) {
            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    handleEnrollResult(deviceId, fingerId, groupId, remaining);
                }
            });
        }

        @Override
        public void onAcquired(final long deviceId, final int acquiredInfo) {
            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    handleAcquired(deviceId, acquiredInfo);
                }
            });
        }

        @Override
        public void onAuthenticated(final long deviceId, final int fingerId, final int groupId) {
            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    handleAuthenticated(deviceId, fingerId, groupId);
                }
            });
        }

        @Override
        public void onError(final long deviceId, final int error) {
            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    handleError(deviceId, error);
                }
            });
        }

        @Override
        public void onRemoved(final long deviceId, final int fingerId, final int groupId) {
            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    handleRemoved(deviceId, fingerId, groupId);
                }
            });
        }

        @Override
        public void onEnumerate(final long deviceId, final int[] fingerIds, final int[] groupIds) {
            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    handleEnumerate(deviceId, fingerIds, groupIds);
                }
            });
        }
    };

各個(gè)client接收到回調(diào)事件,則會(huì)調(diào)用第二個(gè)接口FingerprintServiceReceiver

2. FingerprintServiceReceiver

FingerprintServiceReceiver是FingerprintManager中總的回調(diào)接口冤议,用于回調(diào)EnrollmentCallback,AuthenticationCallback等上層接口

 private IFingerprintServiceReceiver mServiceReceiver = new Stub() {
        public void onEnrollResult(long deviceId, int fingerId, int groupId, int remaining) {
            FingerprintManager.this.mHandler.obtainMessage(100, remaining, 0, new Fingerprint((CharSequence)null, groupId, fingerId, deviceId)).sendToTarget();
        }

        public void onAcquired(long deviceId, int acquireInfo) {
            FingerprintManager.this.mHandler.obtainMessage(101, acquireInfo, 0, deviceId).sendToTarget();
        }

        public void onAuthenticationSucceeded(long deviceId, Fingerprint fp, int userId) {
            FingerprintManager.this.mHandler.obtainMessage(102, userId, 0, fp).sendToTarget();
        }

        public void onAuthenticationFailed(long deviceId) {FingerprintManager.this.mHandler.obtainMessage(103).sendToTarget();
        }

        public void onError(long deviceId, int error) {
            FingerprintManager.this.mHandler.obtainMessage(104, error, 0, deviceId).sendToTarget();
        }

        public void onRemoved(long deviceId, int fingerId, int groupId) {
            FingerprintManager.this.mHandler.obtainMessage(105, fingerId, groupId, deviceId).sendToTarget();
        }
    };

錄入指紋流程:

調(diào)用:

FingerprintManager.enroll(userId,receiver,...)
->service.enroll(userId,receiver,...)
->startEnrollment(userId,receiver,...)

  • startEnrollment(userId,receiver,...)
private void startEnrollment(IBinder token, byte [] cryptoToken, int userId,
            IFingerprintServiceReceiver receiver, int flags, boolean restricted,
            String opPackageName) {
        updateActiveGroup(userId, opPackageName);
        //注意groupId = userId
        final int groupId = userId; // default group for fingerprint enrollment
        //保存receiver
        EnrollClient client = new EnrollClient(getContext(), mHalDeviceId, token, receiver,
                userId, groupId, cryptoToken, restricted, opPackageName) {
       }
      

-> 初始化一個(gè)EnrollClient,調(diào)用startClient()
->client.start()
-> daemon.enroll(mCryptoToken, getGroupId(), timeout)開始錄入
(FingerprintManager中回調(diào)接口IFingerprintServiceReceiver會(huì)保存在EnrollClient中以待回調(diào))

回調(diào):

IFingerprintDaemonCallback
->onEnrollResult(fingerid 蕊温,deviceid,groupid发笔,remaining)
-> client.onEnrollResult()

  • client.onEnrollResult(fingerId, groupId, remaining):
  1. 若錄入完成了讨,將id等信息保存xml
public boolean onEnrollResult(int fingerId, int groupId, int remaining) {
        if (groupId != getGroupId()) {
            Slog.w(TAG, "groupId != getGroupId(), groupId: " + groupId +
                    " getGroupId():" + getGroupId());
        }
        //錄入完成
        if (remaining == 0) {
        //#1
           FingerprintUtils.getInstance().addFingerprintForUser(getContext(), fingerId,
                    getTargetUserId());
        }
        return sendEnrollResult(fingerId, groupId, remaining);
    }

#1:保存該指紋信息

 public void addFingerprintForUser(Context ctx, int fingerId, int userId) {
        //#2:getStateForUser:獲取UserState量蕊,若沒有則初始化一個(gè)UserState艇挨。
        //構(gòu)造方法中會(huì)根據(jù)該userId查詢之前保存的指紋File(xml),初始化一個(gè)mFingerprints集合缩滨。
        
        //#3:addFingerprint:添加進(jìn)mFingerprints集合,寫入File苞冯。
        //注意寫入的groupId就是userId舅锄。
        getStateForUser(ctx, userId).addFingerprint(fingerId, userId);
    }
  1. sendEnrollResult
    ->receiver.onEnrollResult
    ->FingerprintManafger.sendEnrollResult
   private void sendEnrollResult(Fingerprint fp, int remaining) {
            if (FingerprintManager.this.mEnrollmentCallback != null) {
                    FingerprintManager.this.mEnrollmentCallback.onEnrollmentProgress(remaining);
            }

    }

驗(yàn)證指紋流程:

調(diào)用:

FingerprintManager.authenticate(userId,receiver,...)
->service.authenticate (userId,receiver,...)
->初始化一個(gè)AuthenticationClient , 調(diào)用startClient(userId,receiver,...)
->client.start()
->daemon.authenticate(mOpId, getGroupId())開始驗(yàn)證
(FingerprintManager中回調(diào)接口IFingerprintServiceReceiver同樣會(huì)保存在AuthenticationClient中以待回調(diào))

回調(diào):

IFingerprintDaemonCallback
->onAuthenticated(fingerid 皇忿,deviceid鳍烁,groupid繁扎,token)
->client.onAuthenticated

  • client.onAuthenticated:
    根據(jù)指紋結(jié)果回調(diào)Receiver中的onAuthenticationSucceeded糊闽,onAuthenticationFailed等方法右犹。

修改

enroll錄入

因?yàn)镋nrollmentCallback沒有獲取正在錄制的指紋id參數(shù)接口念链,所以自己提供一個(gè)獲取方法莉炉。

  1. 新增enrollFingerId變量
private int enrollFingerId = -1;
  1. 新增getEnrollFingerId方法:
public int getEnrollFingerId() {
        return this.enrollFingerId;
    }
  1. enroll方法重置enrollFingerId
 public void enroll(byte[] token, CancellationSignal cancel, int flags, int userId, FingerprintManager.EnrollmentCallback callback) {
        this.enrollFingerId = -1;
}
  1. sendEnrollResult中enrollFingerId保存fingerId
  private void sendEnrollResult(Fingerprint fp, int remaining) {
            if (FingerprintManager.this.mEnrollmentCallback != null) {
               //+++
               FingerprintManager.this.enrollFingerId = fp.getFingerId();
                FingerprintManager.this.mEnrollmentCallback.onEnrollmentProgress(remaining);
            }

        }
authenticate驗(yàn)證

因?yàn)樵贏uthenticationClient.onAuthenticated(int fingerId, int groupId)中isRestricted=true梆暮,從而在FingerprintManager的AuthenticationCallback.onAuthenticationSucceeded參數(shù)中的Fingerprint對象為null绍昂。

   Fingerprint fp = !getIsRestricted()
                            ? new Fingerprint("" /* TODO */, groupId, fingerId,
                                    FingerprintUtils.isSoterSimulated() ?
                                            548398617248L : getHalDeviceId())
                            : null;

FingerprintService修改:

        private boolean isRestricted() {
            // Only give privileged apps (like Settings) access to fingerprint info
// ---           final boolean restricted = !hasPermission(MANAGE_FINGERPRINT);
// ---           return restricted;

//  +++
            return false;
        }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末唠椭,一起剝皮案震驚了整個(gè)濱河市忍饰,隨后出現(xiàn)的幾起案子艾蓝,更是在濱河造成了極大的恐慌,老刑警劉巖亮靴,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件茧吊,死亡現(xiàn)場離奇詭異八毯,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)休讳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來活合,“玉大人,你說我怎么就攤上這事留晚「娉埃” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵赋焕,是天一觀的道長隆判。 經(jīng)常有香客問我僧界,道長,這世上最難降的妖魔是什么咬腕? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任葬荷,我火速辦了婚禮,結(jié)果婚禮上煞赢,老公的妹妹穿的比我還像新娘哄孤。我一直安慰自己,他們只是感情好凝危,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布蛾默。 她就那樣靜靜地躺著捉貌,像睡著了一般冬念。 火紅的嫁衣襯著肌膚如雪急前。 梳的紋絲不亂的頭發(fā)上瀑构,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天寺晌,我揣著相機(jī)與錄音,去河邊找鬼呻征。 笑死,一個(gè)胖子當(dāng)著我的面吹牛边篮,可吹牛的內(nèi)容都是我干的戈轿。 我是一名探鬼主播阵子,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼色乾!你這毒婦竟也來了领突?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤澎办,失蹤者是張志新(化名)和其女友劉穎局蚀,沒想到半個(gè)月后恕稠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡千扶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年县貌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了凑懂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,965評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡摆碉,死狀恐怖脓豪,靈堂內(nèi)的尸體忽然破棺而出扫夜,到底是詐尸還是另有隱情,我是刑警寧澤笤闯,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布堕阔,位于F島的核電站颗味,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏浦马。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一谨娜、第九天 我趴在偏房一處隱蔽的房頂上張望磺陡。 院中可真熱鬧,春花似錦垢油、人聲如沸滩愁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽正压。三九已至责球,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間雏逾,已是汗流浹背栖博。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工仇让, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人卫玖。 一個(gè)月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓骇笔,卻偏偏與公主長得像嚣崭,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子芦劣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評論 2 355

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