指纹模块流程分析(五)之指纹的解锁流程

五、指纹的解锁流程

指纹解锁的核心类FingerprintUnlockController,实现了KeyguardUpdateMonitorCallback

public class FingerprintUnlockController extends KeyguardUpdateMonitorCallback {

    @Override

    public void onFingerprintAuthenticated(int userId) {

        ......

        switch (mMode) {

            case MODE_DISMISS_BOUNCER://亮屏并且出现图案锁

                mStatusBarKeyguardViewManager.notifyKeyguardAuthenticated(

                        false /* strongAuth */);

                break;

            case MODE_UNLOCK://亮屏不出现图案锁

扫描二维码关注公众号,回复: 10849560 查看本文章

                if (!wasDeviceInteractive) {

                    mStatusBarKeyguardViewManager.notifyDeviceWakeUpRequested();

                }

                mStatusBarKeyguardViewManager.animateCollapsePanels(

                        FINGERPRINT_COLLAPSE_SPEEDUP_FACTOR);

                break;

            ......

            case MODE_WAKE_AND_UNLOCK://息屏锁屏解锁

                mStatusBarWindowManager.setStatusBarFocusable(false);

                mDozeScrimController.abortPulsing();

                mKeyguardViewMediator.onWakeAndUnlocking();

                mScrimController.setWakeAndUnlocking();

                if (mPhoneStatusBar.getNavigationBarView() != null) {

                    mPhoneStatusBar.getNavigationBarView().setWakeAndUnlocking(true);

                }

                break;

            ......

            case MODE_DISMISS_KEYGUARD://通话界面息屏解锁

                mStatusBarWindowManager.setStatusBarFocusable(false);

                mKeyguardViewMediator.onWakeAndUnlocking();

                if (mPhoneStatusBar.getNavigationBarView() != null) {

                    mPhoneStatusBar.getNavigationBarView().setWakeAndUnlocking(true);

                }

                break;

        }

        ......

    }

 

    @Override

    public void onFinishedGoingToSleep(int why) {

        ......

    }

    @Override

    public void onFingerprintAuthFailed() {

        cleanup();

    }

 

    @Override

    public void onFingerprintError(int msgId, String errString) {

        cleanup();

 

        if(Settings.Global.getInt(mContext.getContentResolver(),"persist.fg.errorshow",0) == 0){

            if(!mPowerManager.isScreenOn()){

                mPowerManager.wakeUp(SystemClock.uptimeMillis());

            }else {

                mStatusBarKeyguardViewManager.animateCollapsePanels(

                            FINGERPRINT_COLLAPSE_SPEEDUP_FACTOR);

            }

            Settings.Global.putInt(mContext.getContentResolver(),"persist.fg.errorshow",1);

        }

 

    }

KeyguardUpdateMonitor类为解锁屏模块的监听者,它负责监听时间、sim卡、运营商信息、电池信息、电话信息等状态的变化,并通知keyguard View模块更新显示。这个类里面还有有监听指纹的方法startListeningForFingerprint, 该方法调用了FingerprintManager的authenticate()方法并且参数中传入了AuthenticationCallback对象,AuthenticationCallback类中调用了KeyguardUpdateMonitorCallback的方法,FingerprintUnlockController实现了KeyguardUpdateMonitorCallback这样就能实现指纹解锁。

private void startListeningForFingerprint() {

        ......

        //调用了FingerprintManagerauthenticate()方法

        mFpm.authenticate(null, mFingerprintCancelSignal, 0,

        mAuthenticationCallback, null, userId);

        ......

        }

 

 private FingerprintManager.AuthenticationCallback mAuthenticationCallback

            = new AuthenticationCallback() {

        //指纹匹配失败(没超过5次)

        @Override

        public void onAuthenticationFailed() {

            handleFingerprintAuthFailed();

        };

        //指纹匹配成功

        @Override

        public void onAuthenticationSucceeded(AuthenticationResult result) {

            handleFingerprintAuthenticated(result.getUserId());

        }

        //指纹匹配提示

        @Override

        public void onAuthenticationHelp(int helpMsgId, CharSequence helpString) {

            handleFingerprintHelp(helpMsgId, helpString.toString());

        }

        //指纹匹配错误(匹配失败次数超过5次)

        @Override

        public void onAuthenticationError(int errMsgId, CharSequence errString) {

            handleFingerprintError(errMsgId, errString.toString());

        }

        //获得到指纹

        @Override

        public void onAuthenticationAcquired(int acquireInfo) {

           if(Settings.Global.getInt(mContext.getContentResolver(),"persist.

            fg.errorshow",0) == 1){

                Settings.Global.putInt(mContext.getContentResolver(),"persist

                .fg.errorshow",0);

            }

 

            handleFingerprintAcquired(acquireInfo);

        }

    };

 

    private void handleFingerprintAuthenticated(int authUserId) {

        ......

        onFingerprintAuthenticated(userId);

        ......

 

    private void onFingerprintAuthenticated(int userId) {

        mUserFingerprintAuthenticated.put(userId, true);

        ......

        for (int i = 0; i < mCallbacks.size(); i++) {

            KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();

            if (cb != null) {

                //这里会调用FingerprintUnLockController中的onFingerprintAuthenticated方法处理解锁

                cb.onFingerprintAuthenticated(userId);

            }

        }

        .....

    }

回来继续看FingerprintManager的authenticate()方法,此方法继续调用了FingerprintServiceWarpper的authenticate方法(FingerprintManager与FingerprintService直接通过aidl来通信)。

public void authenticate(@Nullable CryptoObject crypto, @Nullable

        ......

        mService.authenticate(mToken, sessionId, userId, mServiceReceiver,

                    flags,mContext.getOpPackageName());

        ......

    }

private final class FingerprintServiceWrapper extends IFingerprintService.Stub {

        @Override // Binder call

        public void authenticate(final IBinder token, final long opId,

        final int groupId,final IFingerprintServiceReceiver receiver,

        final int flags,final String opPackageName) {

            startAuthentication(token, opId, callingUserId, groupId,

            receiver, flags, restricted, opPackageName);

    }

    startAuthentication方法会调用AuthenticationClientstart方法,AuthenticationClient

    是为给定的客户端跟踪指纹认证状态。

    public abstract class AuthenticationClient extends ClientMonitor {

 

        public AuthenticationClient(Context context, long halDeviceId, IBinder token,

        IFingerprintServiceReceiver receiver, int targetUserId,

        int groupId, long opId,boolean restricted, String owner) {

            super(context, halDeviceId, token, receiver, targetUserId,

            groupId, restricted, owner);

        }

        //指纹库处理结果调用

        @Override

        public boolean onAuthenticated(int fingerId, int groupId) {

            ......

            boolean authenticated = fingerId != 0;

            if (!authenticated) {

                //认证失败

                receiver.onAuthenticationFailed(getHalDeviceId());

            } else {

                //认证成功

                receiver.onAuthenticationSucceeded(getHalDeviceId(), fp, getTargetUserId());

            }

            if (!authenticated) {

                if (inLockoutMode) {

                    //认证错误

                    receiver.onError(getHalDeviceId(),

                             FingerprintManager.FINGERPRINT_ERROR_LOCKOUT);

                  }

            }

            ......

        }

        /**

         * Start authentication

         */

        @Override

        public int start() {

            IFingerprintDaemon daemon = getFingerprintDaemon();

            ......

            final int result = daemon.authenticate(mOpId, getGroupId());

            ......

            return 0; // success

        }

start方法会调用fingerprintd,调用底层的指纹库,底层库返回结果后会调用onAuthenticated来反馈结果给receiver,在往上层反馈。这就是指纹的识别流程。

发布了31 篇原创文章 · 获赞 6 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/u012824529/article/details/104498388
今日推荐