指纹解锁原理_屏幕指纹解锁的技术原理 - CSDN
精华内容
参与话题
  • 指纹解锁基本原理

    万次阅读 2018-07-06 09:38:55
    启动指纹监听: 用户打开指纹识别开关时,开机初始化,唤醒,睡眠,都回调到 updateFingerprintListeningState更新是否打开指纹监听。 private void updateFingerprintListeningState() { boolean ...

    启动指纹监听:  用户打开指纹识别开关时,开机初始化,唤醒,睡眠,都回调到 updateFingerprintListeningState更新是否打开指纹监听。

       private void updateFingerprintListeningState() {

           boolean shouldListenForFingerprint = shouldListenForFingerprint();

           if (mFingerprintDetectionRunning && !shouldListenForFingerprint){

               stopListeningForFingerprint();

           } else if (!mFingerprintDetectionRunning && shouldListenForFingerprint){

               startListeningForFingerprint();

           }

        }

    startListeningForFingerprint 中调用mFpm.authenticate(null,mFingerprintCancelSignal, 0, mAuthenticationCallback, null, userId);实现指纹监听扫描。

     

    FingerprintManager 通过跨进程调用实现:它实际就调到了FingerprintService内部类 FingerprintServiceWrapper中的方法。如下:(关于mService为什么是FingerprintService后面有说明)

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

                       mContext.getOpPackageName());

    FingerprintService.java 内部类FingerprintServiceWrapper的方法:

        @Override // Binder call

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

                    finalIFingerprintServiceReceiver receiver, final int flags,

                    final String opPackageName) {

               if (!isCurrentUserOrProfile(UserHandle.getCallingUserId())) {

                    Slog.w(TAG, "Can'tauthenticate non-current user");

                    return;

               }

               if (!canUseFingerprint(opPackageName)) {

                    Slog.w(TAG, "Calling notgranted permission to use fingerprint");

                    return;

               }

     

               // Group ID is arbitrarily set to parent profile user ID. It justrepresents

               // the default fingerprints for the user.

               final int effectiveGroupId = getEffectiveUserId(groupId);

     

               final boolean restricted = isRestricted();

               mHandler.post(new Runnable() {

                    @Override

                    public void run() {

                        startAuthentication(token, opId,effectiveGroupId, receiver, flags, restricted);

                    }

               });

           }

     

    关于mService为什么是FingerprintService后面有说明如下:

     

      FingerprintService.java在其中注册了FINGERPRINT_SERVICE服务,方便系统直接通过

    SystemServer中调用FingerprintService的start方法最后调到publishBinderService来绑定服务

       mSystemServiceManager.startService(FingerprintService.class);---》publishBinderService

    ServiceManager.getService进行获取:

      publishBinderService(Context.FINGERPRINT_SERVICE, newFingerprintServiceWrapper());

    (publishBinderService 的实际实现systemService.java的ServiceManager.addService(name, service, allowIsolated);)

     

    注册初始化:FingerprintManager,这样fingerprintManager就可以以代理的方式调用FingprintService

          SystemServiceRegistry.java中:

           registerService(Context.FINGERPRINT_SERVICE, FingerprintManager.class,

                    newCachedServiceFetcher<FingerprintManager>() {

               @Override

               public FingerprintManager createService(ContextImpl ctx) {

                    IBinder binder =ServiceManager.getService(Context.FINGERPRINT_SERVICE);

                    IFingerprintService service =IFingerprintService.Stub.asInterface(binder);

                    return newFingerprintManager(ctx.getOuterContext(), service);

               }});

     

     

    mService.authenticate最后调到了:   final int result = daemon.authenticate(opId,groupId);

    这个也同样是跨进程调用,被调用的进程是fingerd (C++书写的守护进程)。

     

     

    fingerd进程分析:

          入口为fingerprintd.cpp文件中的main函数:

     android::sp<android::FingerprintDaemonProxy>proxy =

               android::FingerprintDaemonProxy::getInstance();

       android::status_t ret = serviceManager->addService(

               android::FingerprintDaemonProxy::descriptor, proxy);

    添加服务到serviceManager中这样framework代码就可以跨进程拿到这个服务也是aidl原理。不过这个是实现了c++aidl.

         那我们就开始看它核心(FingerprintDaemonProxy)proxy 到底做了些什么?

    其中包括:

    FingerprintDaemonProxy::authenticate  指纹认证实际调用的地方:daemon.authenticate就调用fingerd这个函数;

     

    FingerprintDaemonProxy::init初始化:如进行初始化一个回调等

             在FingerprintService就有用到:(注册一个回调给fingerd)      

           public IFingerprintDaemongetFingerprintDaemon() {

           if (mDaemon == null) {

               mDaemon =IFingerprintDaemon.Stub.asInterface(ServiceManager.getService(FINGERPRINTD));

               if (mDaemon != null) {

                    try {

                       mDaemon.asBinder().linkToDeath(this, 0);

                       mDaemon.init(mDaemonCallback);

                        mHalDeviceId =mDaemon.openHal();

     

     

    FingerprintDaemonProxy::hal_notify_callback  注册到device驱动中:如FingerprintDaemonProxy::openHal() ---》err =mDevice->set_notify(mDevice, hal_notify_callback);  如:驱动进行指纹的识别动作,根据不同的返回码调用hal_notify_callback这个回调,这个回调最后回调到mDaemon.init(mDaemonCallback);初始化进去的mDaemonCallback(即框架上层的回调)

     

    如authenticate  操作经过指纹汇顶驱动进行匹配后,会回调执行到以下函数。 最后通过callback->onAuthenticated回调反馈给上层处理。

     

       caseFINGERPRINT_AUTHENTICATED:

                ALOGD("onAuthenticated(fid=%d, gid=%d)",

                        msg->data.authenticated.finger.fid,

                        msg->data.authenticated.finger.gid);

                if (msg->data.authenticated.finger.fid!= 0) {

                    const uint8_t* hat = reinterpret_cast<const uint8_t*>(&msg->data.authenticated.hat);

                    instance->notifyKeystore(hat,sizeof(msg->data.authenticated.hat));

                }

                callback->onAuthenticated(device,

                        msg->data.authenticated.finger.fid,

                        msg->data.authenticated.finger.gid);

               break;

     

     

    那么上层的callback->onAuthenticated是怎么处理的呢?

    callback实际上是FingerprintService.java中的IFingerprintDaemonCallbackmDaemonCallback = new IFingerprintDaemonCallback.Stub(){

          @Override

           public void onAuthenticated(long deviceId, int fingerId, int groupId) {

               dispatchAuthenticated(deviceId, fingerId, groupId);

           }

    }

    --------->最后调到:receiver.onAuthenticationSucceeded(mHalDeviceId,fp);

       

    receiver实际是:KeyguardUpdateMonitor.java

     

    privateFingerprintManager.AuthenticationCallback mAuthenticationCallback

               = new AuthenticationCallback() {

     

           @Override

           public void onAuthenticationSucceeded(AuthenticationResult result) {

               handleFingerprintAuthenticated();

           }

     

       };

     

    handleFingerprintAuthenticated 会调到KeyguardUpdateMonitorCallback,而其中的一个KeyguardUpdateMonitorCallback实际就是KeyguardViewMediator.onFingerprintAuthenticated这个函数就实现了解锁功能:

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

     cb.onFingerprintAuthenticated(userId,wakeAndUnlocking);

    **************

       public void onFingerprintAuthenticated(int userId, booleanwakeAndUnlocking) {

                    if (wakeAndUnlocking &&mShowing && unlockingWithFingerprintAllowed) {

                        mWakeAndUnlocking = true;

                       mStatusBarKeyguardViewManager.setWakeAndUnlocking();

                        keyguardDone(true, true);

                    } else if (mShowing &&mDeviceInteractive) {

                        if (wakeAndUnlocking) {

                           mStatusBarKeyguardViewManager.notifyDeviceWakeUpRequested();

                        }

                       mStatusBarKeyguardViewManager.animateCollapsePanels(

                               FINGERPRINT_COLLAPSE_SPEEDUP_FACTOR);

                    }

               }

           };

    ***************

    KeyguardViewMediator.onFingerprintAuthenticated这个函数就实现了解锁功能:

        黑屏指纹解锁调用:keyguardDone(true,true);

        亮屏指纹解锁调用:mStatusBarKeyguardViewManager.animateCollapsePanels(

                               FINGERPRINT_COLLAPSE_SPEEDUP_FACTOR);

     

    先讲解:亮屏指纹解锁调用的过程:

       1:状态栏的一些处理 :如: PanelView

       2:执行mBar.makeExpandedInvisible(); 实现解锁

         1)添加mHideExpandedRunnable到sPendingRunnables中

         2)postAnimationCallback调用执行sPendingRunnables

     private Runnable mHideExpandedRunnable = new Runnable() {

           @Override

           public void run() {

               mBar.makeExpandedInvisible();

           }

       };

    上面的mHideExpandedRunnable是由下面函数进行调用的。

     

      private staticvoid postAnimationCallback() {

           sChoreographer.postCallback(Choreographer.CALLBACK_ANIMATION,sAnimationCallbackRunnable,

                   null);

        }

     

    其中有对于调用的控制最后又doFrame 做每一帧的时候根据条件调用doCallbacks函数,这里会调用到上列的mHideExpandedRunnable。

     

     

     

    执行mBar.makeExpandedInvisible();实现解锁的解锁过程:

    1)最终它也是调用mViewMediatorCallback.keyguardDone(true);实现的解锁

        通过:

    makeExpandedInvisible  --》StatusBarKeyguarViewManager.dismiss(booleanauthenticated)--> showBouncer--->KeyguardBouncer.show(..)--->mKeyguardView.dismiss(authenticated)

     

    mKeyguardView.dismiss(authenticated)就是实现解锁的关键方法:

       KeyguardHostView.dismiss() -->KeyguardSecurityContainer. showNextSecurityScreenOrFinish(....)

     

    showNextSecurityScreenOrFinish最终会调到mSecurityCallback.finish();

    而mSecurityCallback是KeyguardHostView.即最终调了KeyguardHostView. finish()

            if (mViewMediatorCallback != null) {

               if (deferKeyguardDone) {

                   mViewMediatorCallback.keyguardDonePending();

               } else {

                   mViewMediatorCallback.keyguardDone(true);

               }

           }

     

    ***************************************************************************

    mViewMediatorCallback实际是定义在KeyguardViewMediator.java中

    ViewMediatorCallback mViewMediatorCallback= new ViewMediatorCallback() {

     

           public void userActivity() {

               KeyguardViewMediator.this.userActivity();

           }

     

           public void keyguardDone(boolean authenticated) {

               if (!mKeyguardDonePending) {

                    KeyguardViewMediator.this.keyguardDone(authenticated,true);

               }

           }

     

    这里终于调到了KeyguardViewMediator.keyguardDone.

     

     

     

     

     

    那我们从现在开始论述KeyguardViewMediator.keyguardDone.的解锁过程:

    keyguardDone 实际调用解锁handleHide

      最终它会跑到如下的代码进入框架进行解锁流程:

     

        private final RunnablemKeyguardGoingAwayRunnable = new Runnable() {

            @Override

            public void run() {

                try {

                   mStatusBarKeyguardViewManager.keyguardGoingAway();

     

                    // Don't actually hide theKeyguard at the moment, wait for window

                    // manager until it tells usit's safe to do so with

                    // startKeyguardExitAnimation.

                   ActivityManagerNative.getDefault().keyguardGoingAway(

                            mStatusBarKeyguardViewManager.shouldDisableWindowAnimationsForUnlock()

                                    ||mWakeAndUnlocking,

                           mStatusBarKeyguardViewManager.isGoingToNotificationShade());

                } catch (RemoteException e) {

                    Log.e(TAG, "Error whilecalling WindowManager", e);

                }

            }

        };

     其中mStatusBarKeyguardViewManager.shouldDisableWindowAnimationsForUnlock()

                                    ||mWakeAndUnlocking,

    可以控制解锁进桌面是否播放动画。keyguardGoingAway先是通过ActivityManagerService调到WindowManagerService的keyguardGoingAway

    设置了mAnimator属性后直接进入requestTraversalLocked();进行窗口的变化。

    performLayoutAndPlaceSurfacesLocked--》performLayoutAndPlaceSurfacesLockedLoop--》performLayoutAndPlaceSurfacesLockedInner---》

    这个过程有很多窗口的layout 等最后跑到scheduleAnimationLocked();函数中。最后进入WindowAnimator的窗口动画中。

     

    scheduleAnimationLocked到animateLocked   的过程:

    mChoreographer.postFrameCallback(mAnimator.mAnimationFrameCallback);其实它是通过Choreographer机制最后调用mAnimationFrameCallback------Choreographer通过利用Vsync机制执行执行Choreographer.dnFrame从而通过doCallbacks(Choreographer.CALLBACK_ANIMATION,frameTimeNanos);调用到了mAnimationFrameCallback

     

     

     

    下面说一下animateLocked主要干了些什么?  

    window动画分为两种:窗口中的动画,Activity切换个动画。

     

       1)updateWindowsLocked

    这里需要指出的变量是:   

    // Currentlyrunning animation.

        boolean mAnimating;

      if (mAnimating) {

                   mService.scheduleAnimationLocked();

                }

    它是判断当前是否在有动画在执行:判断规则比较严格,如果窗口还有更多动画,或有Activity动画它都会反复调用scheduleAnimationLocked进行多次执行,这是为了保证窗口的画面的正确性。有时我们能通过判断这个变量拿到窗口动画执行的总时间。

    下面通过代码分析认证这个:

    updateWindowsLocked(displayId);

    就是通过这个进行条件判断:winAnimator.stepAnimationLocked(mCurrentTime);里面就是通过判断

    窗口是否还有更多动画需要执行,或有Activity动画来返回true或false来赋值mAnimating

     

    updateWallpaperLocked(displayId)

    updateWallpaperLocked同样也会进行判断:winAnimator.mAnimating来赋值mAnimating

    如果最终mAnimating是True它会再次执行scheduleAnimationLocked

      if (mAnimating) {

                   mService.scheduleAnimationLocked();

                }

     

          最终这个过程通过mPolicy.startKeyguardExitAnimation(mCurrentTime, 0 /*duration */);跑出框架。mPolicy实际是PhoneWindowManager对象。即最终调用了

       public void startKeyguardExitAnimation(longstartTime, long fadeoutDuration) {

    mKeyguardDelegate.startKeyguardExitAnimation(startTime,fadeoutDuration);

            }

        }

    然后调到mKeyguardService.startKeyguardExitAnimation(startTime,fadeoutDuration);

    即调到了KeyguardViewMediator的handleStartKeyguardExitAnimation

    很多时候我们可以认为如果调到handleStartKeyguardExitAnimation那么解锁就完成了,但严格上也不能说它完成了(因为这时候其实窗口还是在变化中,我们无法确定窗口时候已经全部绘画完成),所以这个函数很多时候用来处理解锁完成后的一些事情。

     

      2)updateWallpaperLocked

    3:窗口动画的呈现:WinAnimator.prepareSurfaceLocked

       1)  computeShownFrameLocked(); 计算需要呈现的动画

       2)赋值动画变化矩阵,透明度,Z轴到mSurfaceControl中

         

                       mSurfaceAlpha = mShownAlpha;

                       mSurfaceControl.setAlpha(mShownAlpha);

                       mSurfaceLayer = mAnimLayer;

                       mSurfaceControl.setLayer(mAnimLayer);

                       mSurfaceControl.setMatrix(

                                mDsDx * w.mHScale,mDtDx * w.mVScale,

                                mDsDy * w.mHScale,mDtDy * w.mVScale);

      3)通过surfacefinger绘制surface画布纹理从而实现动画。

         showSurfaceRobustlyLocked.mSurfaceControl.show();

     

     

    再说一下Choreographer机制:

     

     

    最后会执行到    调用输入窗口,其他窗口,窗口动画的回调函数

      mFrameInfo.markInputHandlingStart();

               doCallbacks(Choreographer.CALLBACK_INPUT, frameTimeNanos);

     

                mFrameInfo.markAnimationsStart();

               doCallbacks(Choreographer.CALLBACK_ANIMATION, frameTimeNanos);

     

               mFrameInfo.markPerformTraversalsStart();

               doCallbacks(Choreographer.CALLBACK_TRAVERSAL, frameTimeNanos);

     

                doCallbacks(Choreographer.CALLBACK_COMMIT,frameTimeNanos);

    如下面所列都用到这个机制:

        1:窗口动画:mChoreographer.postFrameCallback(mAnimator.mAnimationFrameCallback);

        2:View的添加然后窗口创建:

    如:应用通过addView来添加布局View

    1.   //3 选定了窗口修饰布局文件 ,添加至DecorView对象里,并且指定mcontentParent  
    2.     View in = mLayoutInflater.inflate(layoutResource, null);  
    3.     decor.addView(in, new ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT)); 

    它的工作原理是:

    ViewRootImp是用户与WMS沟通的桥梁,通过DectorView .addView

    ViewRootImp.setView----> ViewRootImp. requestLayout-->ViewRootImp. scheduleTraversals最后会执行到:

       mChoreographer.postCallback(

                           Choreographer.CALLBACK_TRAVERSAL, mTraversalRunnable, null);

     

    最后执行到mTraversalRunnable这个回调函数:

    mTraversalRunnable做了些什么呢?

      1) performMeasure   View进行大小计算

      2) performLayout      View进行布局

    2) performDraw();  进行绘画

     

     

    代码过程如下:

    doTraversal()-->performTraversals ---》performMeasure  

                    

                                          ---》performLayout     

                                          ---》performDraw

    performDraw的过程比较有意思:

     

      performDraw --》draw(fullRedrawNeeded);

    draw(fullRedrawNeeded);主要作用

      1:  surface = mSurface;拿到计算后的刚才通过performMeasure  ,performLayout    过程后的surface纹理画布

      2:drawSoftware(surface, mAttachInfo, xOffset,yOffset, scalingRequired, dirty)通过mView.draw(canvas)遍历绘制DectorView, surface.unlockCanvasAndPost(canvas);sufaceFinger绘制这个suface.

     3:判断是否有动画,如果有,走动画的过程。

    if(animating) {

                mFullRedrawNeeded = true;

                scheduleTraversals();

            }

    展开全文
  • 屏下指纹技术实现方案与原理

    万次阅读 2019-06-17 23:23:38
    vivo X20 Plus屏下指纹,其原理是利用光电反射技术,专门适配OLED屏幕的RGB Pixel发出光线,穿透0.68mm厚度的玻璃盖板到达手指,因手指的不同纹路导致反射光线不同,这些反射光线再穿透屏幕,到达指纹Sensor,从而...

    1月24日,全球第一台量产的屏幕指纹手机vivo X20 Plus屏幕指纹版正式在北京亮相。 据悉,该手机屏幕指纹版已经支持支付宝和微信的指纹支付。

    vivo X20 Plus屏下指纹,其原理是利用光电反射技术,专门适配OLED屏幕的RGB Pixel发出光线,穿透0.68mm厚度的玻璃盖板到达手指,因手指的不同纹路导致反射光线不同,这些反射光线再穿透屏幕,到达指纹Sensor,从而实现指纹识别。

    光电反射技术

    在实际使用测试过程中,手机提起的时候,屏幕指纹识别区域自动亮起提示,直接手指放上去即可解锁,不需要操作电源键。按压力度方面,在录入指纹的时候相比起过去的指纹识别,在按下去的时候要稍微多一点点力,毕竟中间多了一层OLED屏幕,始终没有传统指纹识别那么直接。不过,前面说的只是录入,录入完之后,指纹识别就很好解锁了,不用按下去的动作,直接把手指轻触屏幕就可以解锁,跟以往的指纹解锁并没有区别。

    此前三星中国设计研究所所长@李炫弘ShaneLee 曾在微博写道:“屏下指纹识别技术现状:硬伤(1):目前良率偏低且年底之前还无法大量生产,并且只是拿了高通+某厂的方案;硬伤 (2):只能穿透AMOLED屏幕(TFT还用不了)。要注意,这里同样提到屏下指纹识别要配合OLED屏幕使用,那么我们就来谈谈屏下指纹识别技术。

    指纹识别技术类型浅析

    众所周知,目前市面上支持指纹识别的手机分三种,一种是集成在正面底部的电源键上,另一种是设计在背部机身上,第三种则是设计在边框上。智能手机进入全面屏时代后,业内普遍认为屏下指纹会是未来发展趋势。

    手机行业中市场份额最大的几家指纹识别模组供应商,瑞典 FPC、美国的 Synaptics、深圳汇顶(Goodix)、台湾 Egis 等都在研发自己的屏下指纹识别技术。

    从指纹识别的技术原理来看,光学、电容、热敏和超声波是四种常见的指纹识别方式。而在手机、平板等电子设备上,体积轻巧、成本低廉的电容式模组是大多数消费电子厂商的首选。

    光学、电容、热敏和超声波,四种常见指纹识别技术

    第一代指纹系技术采用光学识技术,由于光不能穿透皮肤表层(死性皮肤层),所以只能够扫描手指皮肤的表面,或者扫描到死性皮肤层,但不能深入真皮层。在这种情况下,手指表面的干净程度,直接影响到识别的效果。

    第二代指纹识别采用电容传感器技术,目前主流的技术是电容式指纹传感器,然而超音波指纹传感器也有逐渐流行起来趋势。电容式指纹传感器作用时,手指是电容的一极、另一极则是硅芯片数组,透过人体带有的微电场与电容传感器之间产生的微电流,指纹的波峰波谷与传感器之间的距离形成电容高低差,来描绘出指纹的图形。

    iPhone 5采用电容式指纹识别

    第三代指纹识别采用射频技术,分为无线电波探测与超声波探测两种,其原理都与探测海底物质的的声纳类似,是靠特定频率的信号反射来探知指纹的具体形态的。

    超声波指纹识别技术被称作第三代指纹识别技术的代表,相比第一代和第二代指纹识别技术,进步还是相当明显的。

    安放在 Home 键或机身背部下方的电容传感器能够采集手指表面丰富的纹路数据,并加密保存在一个独立的安全区内。完整录入一枚指纹,通常需要在按键上贴 8-12 次。

    今天的电容式指纹传感器识别+解锁速度已经非常理想,从贴上手指到进入主屏只需要 0.15-0.2 秒,日常使用几乎感觉不到等待的时间。

    在安全性上,不少电容指纹模组已经集成了活体检测功能,可以通过热敏(Thermal)传感器感知手指表面的温度变化,人造的假手指或者冷掉的断手指很难通过识别。

    不过,电容传感器也有缺点。它没办法隔着手机屏识别按在屏幕上的指纹,主要是因为屏幕模组本身的厚度导致传感器收集不到足够多有用的信号。超声波指纹传感器,其原理是直接扫描并测绘指纹纹理,甚至连毛孔都能测绘出来。因此超声波获得的指纹是3D立体的,而电容指纹是2D平面的。超声波不仅识别速度更快、而且不受汗水油污的干扰、指纹细节更丰富难以破解。

    这样一来,屏下指纹识别就只能通过穿透力更强的光学和超声波两种方案来实现。

    屏下指纹识别专利技术与工作原理解析

    目前已知的屏下指纹识别方案主要为两个方向:一是利用OLED实现,另一个则是利用超声波实现。光学指纹识别需要光的发射和感应装置,由于LCD和OLED均可以当做光源,那是否意味着在屏幕下面垫一个CMOS传感器就行了呢?

    2.1 利用OLED屏技术实现屏下指纹识别

    屏下指纹识别没有采用TFT-LCD做,其原因在于LCD是被动发光,通过底部的LED背光源透过TFT发光。这层TFT本身并不是那么透光,如果不做改动,直接把手指放上去,屏幕底下的传感器很难识别到指纹。因此如果用TFT-LCD做屏下光学指纹识别,必须给TFT层做技术改进,如加一些缝隙或是打开一个区域,让LED背光照上来。但即使这样,LED背光光源也会很大的干扰指纹反射的光线。所以TFT-LCD屏下光学指纹识别很难实现。

    光学指纹识别的工作原理图

    而由于OLED是主动发光,理论上说可以精确控制到每一个子像素点,所以OLED材质的屏幕是更理想的发射光光源,此外,OLED显示模组更薄,也可以减轻由于放置屏下指纹传感器带来的整体机身变厚的问题。目前产业链有三种利用OLED屏幕的开发方向:

    1、直接在屏幕下方布置一个CMOS传感器,利用OLED的子像素之间缝隙让光线穿透过去,进而识别指纹;2、缩小传感器,插入OLED的像素点之间;3、将CMOS传感器做成透明的,直接贴装于AMOLED屏幕上方,将光学指纹识别做成一层识别层。

    在光学屏下指纹识别方面,很多公司已经开始做出了尝试,并有了初步结果。汇顶科技就展示过利用AMOLED屏幕实现屏下指纹识别的案例,演示机型为三星Galaxy S7 Edge和vivo Xplay6。而汇顶科技就是在屏幕下方布置了一个CMOS传感器,根据汇顶科技在美帝注册的专利: 玄机就在这三张图里了。

    FIG.21A、FIG.21B

    FIG.21A和FIG.21B从俯视和侧视两个角度说明了指纹识别传感器放置的地方。

    FIG.24

    FIG.24从微观角度则说明了光线是如何穿透OLED屏幕的,最上面的就是手指;偏上这层灰色区域就是手机的屏幕部分。透过屏幕的小孔,汇顶称之为“准直孔(Collimator Hole)”,手指反射回的光线光学传感器搜集、处理。

    FIG.26~27

    FIG.10C

    怎么保证光线搜集到的就是来自指纹的反光呢?这就需要对光线准直处理。如图FIG.27,汇顶定制了专门的微透镜阵列(MicroLens Array)、光学空间滤光器阵列(Spatial Filter Array),微透镜阵列需要经过MEMS(微机电系统)技术处理或化学处理。这两个阵列能够保证进入传感器的光线基本都是来自指纹的反光,而非屏幕或是阳光。

    而根据苹果2015年的专利,苹果的实现方式是通过在OLED屏幕下方布置红外发射器(IR Emitter)实现。但苹果已发布的专利较少。

    2.2 LCD屏下指纹识别即将到来

    据悉,vivo新品所采用的屏下指纹识别模块由芯片厂商Synaptics新思国际提供技术支持,传感器型号为Natural ID FS9100,是首款面向手机和平板电脑的光学指纹传感器。它可透过0.68mm厚的盖板玻璃扫描,配置于正面边框底部的盖板玻璃内层(包括2.5D玻璃),来实现光学反射指纹识别。

    近日,JDI也在拿自己的LCD面板做文章。他们以高透明度的玻璃为基质,通过提升已有的Pixel Eyes技术,检测出手指接触屏幕后由于指纹纹理引起的电容变化,从而实现指纹识别。由于没有使用到硅基传感器,屏幕背光可以透过整个指纹识别组件。

    目前他们已经试制了一块8×8毫米0.45英寸的指纹传感器,拥有160×160的分辨率和508的dpi。JDI表示,传感器的尺寸未来可以根据实际需求来特别订制,同时也可以做的更薄甚至是可弯曲的。这样,指纹传感器就能应用于手机、电脑、汽车以及未来物联网的方方面面。不过这项技术刚刚研发成功,JDI计划在明年3月前将其商业化。

    2.3 利用超声波技术实现屏下指纹识别

    另一个屏下指纹识别方向则是利用超声波指纹识别。高通方案称其为Sense ID,指纹识别的龙头企业FPC也刚刚发布了他们的方案。超声波既不需要感光元件也不需要电容感应,因此更适合做屏下指纹识别。Vivo演示机使用的全屏幕指纹识别,采用的正是高通的方案以及欧菲的模组。

    2017年6 月,vivo 曾展示过基于高通超声波方案的屏下指纹识别原型机。同样在2018 CES峰会中,该机就获得了众多媒体和消费者关注。

    vivo 屏下指纹原型机的结构示意

    不过,据媒体现场的体验后表示,稍微改变手指的按压角度,这台 Xplay 6 就会显示解锁不成功。vivo 并没有提供这台原型机具体的识别准确率数据。

    按照高通的说法,这种超声波屏下指纹识别技术可以穿透 1200 微米厚的 OLED 屏幕、800 微米的玻璃和 650 微米的铝合金。

    足够强的穿透性能,就意味着更高的功耗和更大的模组体积。据了解,为高通提供超声波指纹识别模组封装的欧菲光等公司,目前还无法将体积缩到足够小,识别准确率和速度也需要大幅提升。

    原理参照声呐:

    指纹传感器发出超声波,接收被手指反射回来的信号,就能绘制出指纹的“高低起伏”了。

    具体一点讲,其原理是利用超声波具有穿透材料的能力,且随材料的不同产生大小不同的回波(超声波到达不同材质表面时,被吸收、穿透与反射的程度不同)。因此,利用皮肤与空气对于声波阻抗的差异,就可以区分指纹嵴与峪所在的位置。超声波技术所使用的超声波频率为1×104Hz-1×109Hz,能量被控制在对人体无损的程度(与医学诊断的强度相同)。

    目前大规模应用的超声波指纹识别手机并不太多,主要是乙烷的乐视的LeMax2和小米5s。LeMax2将指纹放在了后面,而小米5s则是在正面,当时超声波还穿透不了太厚的玻璃,最厚大约是0.4mm左右,而手机盖板玻璃厚度大约为0.6mm~0.9mm,因此0.4mm的有效厚度不足以穿透玻璃+显示屏(0.6mm+0.3mm)的厚度。小米只好和蓝思科技商量,给前面板玻璃多挖一块走,这样才能保证超声波能穿透,因此把指纹识别区域的玻璃削薄了一些。根据高通官网公开的资料显示,新一代的Sense ID可以穿透1.2mm的OLED屏幕或0.65mm的铝或0.8mm的玻璃。这样的穿透能力,用在目前的玻璃或OLED屏幕上也够了。

    但为什么vivo还没开始在量产的X20等手机上使用?这是因为还需要时间优化算法。新技术从发布到正式应用还需要一个调试的过程,指纹识别是一项对安全性要求相对较高的生物识别技术,因此需要时间对算法优化以提高安全性、识别速度、识别率等。

    然而FPC发布的方案更丧心病狂,FPC称,不管手是干的还是湿的,不管你屏幕是AMOLED还是LCD的,甚至不管你表面材质是不是玻璃,我们都能识别。能穿透多厚呢?20mm!20mm!20mm!重要的事情说三遍。作为对比,高通初代Sense ID是0.4mm,二代也就能穿透1.2mm。FPC能穿透的厚度是高通的16倍多。

    结束语

    根据根据其他屏下指纹识别厂商反馈,目前屏下指纹识别良产率依然是行业共性问题,同时三星的屏幕将会成为众多想要搭载这一功能的手机厂商的桎梏。(屏下指纹识别所引发的交互上的变革和UI的调整是行业性的)而JDI新LCD技术将会让屏下指纹识别走向主流。

    展开全文
  • Android-指纹解锁

    2018-04-09 09:00:24
    什么是指纹解锁技术指纹解锁技术原理理解指纹解锁技术的优势和缺点在Android中的应用开发什么是指纹解锁技术根据人的指纹来验证是否能够解锁的技术,类似于通过输入密码来解锁,都是通过一定的数字特征来解锁。指纹...
    1. 什么是指纹解锁技术

    2. 指纹解锁技术原理理解

    3. 指纹解锁技术的优势和缺点

    4. 在Android中的应用开发

    什么是指纹解锁技术

    根据人的指纹来验证是否能够解锁的技术,类似于通过输入密码来解锁,都是通过一定的数字特征来解锁。

    指纹解锁技术原理理解

    首先说明每个人的每个指纹信息都是独一无二的,皮肤纹路在图案,断点,交叉点上各不相同,通过光学感应读出指纹的图片信息也是独一无二的。

    先保存一个人的指纹特征(图片信息根据算法生成的数据),然后再使用时利用这个人的这个指纹特征去和先前保存的指纹特征做对比,对比一致则解锁成功,对比不一致则解锁失败,对比结果并不是100%一样,而可以按照一个比例来判定,比如90%一样,也可以判定为一致,这个可以根据硬件来设定。

    指纹解锁技术的优势和缺点

    优点:1.使用便捷,直接使用自身的生物特征就可判断能否使用,判别速度快,而输入数字或者拼图解锁是麻烦的并且容易被别人看到。

    缺点:1.安全性不高,指纹是可以被收集的,所以一旦别人收集了你的指纹信息,那需要你指纹解锁的东西将非常危险,而且在不注意的情况下很容易被有心的人收集。

    在Android中的应用开发

    对Android系统来说,指纹解锁是Android6.0才添加的新功能,到Android P系统还会强化指纹解锁的功能,提供越来越便捷的API。


    可以看到在Android P系统中FingerprintDialog以及其中的包含类将会替代FingerprintManager以及其中包含类。原理应该差不多,封装的更简洁易用。

    废话少说,在Android手机中如何开发?

    1.在应用AndroidManifest.xml文件中添加权限:

    <uses-permission android:name="android.permission.USE_FINGERPRINT"/>

    2.获取到指纹管理对象的引用:

    FingerprintManagerCompat fingerprint = FingerprintManagerCompat.from(this);   //v4包下的API,包装内部已经判断Android系统版本是否大于6.0,这也是官方推荐的方式
    FingerprintManager fingerprint2 = (FingerprintManager) getSystemService(Context.FINGERPRINT_SERVICE);  //Android 6.0包下的API

    其实指纹对象依次调用三个方法就够了,

    第一步

        /**
        * Determine if fingerprint hardware is present and functional.
        * @return true if hardware is present and functional, false otherwise.
        */

       fingerprint.isHardwareDetected(); // 判断设备是否支持指纹解锁

    第二步

        /**
        * Determine if there is at least one fingerprint enrolled.
        * @return true if at least one fingerprint is enrolled, false otherwise
        */

       fingerprint.hasEnrolledFingerprints(); //判断设备是否以保存过指纹信息,至少需要保存过一个

    第三步

        /**
        * @param crypto object associated with the call or null if none required.    //不太理解,加密指纹特征还是什么,可以不加密置为null
        * @param flags optional flags; should be 0  //设置标记,暂时无用
        * @param cancel an object that can be used to cancel authentication     //取消验证
        * @param callback an object to receive authentication events   //系统认证完成之后,回调该接口
        * @param handler an optional handler for events  //处理callback接口后,界面的处理,默认是主线程handler
        */

       fingerprint.authenticate(crypto, flags,cancel,callback,handler) //验证指纹

    再来说明各个参数的实现

       crypto = null;  //可以置为null,愿意了解的人可以参考底部博客和源码
       flags = 0;
       cancel = new CancellationSignal();
       callback = new FingerprintManagerCompat.AuthenticationCallback() {
               @Override
               public void onAuthenticationError(int errMsgId, CharSequence errString) {
                   super.onAuthenticationError(errMsgId, errString);
                   //验证错误时,回调该方法。当连续验证5次错误时,将会走onAuthenticationFailed()方法
                   handler.obtainMessage(1,errMsgId,0).sendToTarget();
               }

               @Override
               public void onAuthenticationSucceeded(FingerprintManagerCompat.AuthenticationResult result) {
                   super.onAuthenticationSucceeded(result);
                   //验证成功时,回调该方法。fingerprint对象不能再验证
                   handler.obtainMessage(2).sendToTarget();
               }

               @Override
               public void onAuthenticationFailed() {
                   super.onAuthenticationFailed();
                   //验证失败时,回调该方法。fingerprint对象不能再验证并且需要等待一段时间才能重新创建指纹管理对象进行验证
                   handler.obtainMessage(3).sendToTarget();
               }
           };
        handler = new Handler(getMainLooper()) {   //也可以置为null,系统自动处理
               @Override
               public void handleMessage(Message msg) {
               switch (msg.what) {
                   case 1:   //验证错误
                        //todo 界面处理
                       handleErrorCode(msg.arg1);
                       break;
                   case 2:   //验证成功
                        //todo 界面处理
                        cancel = null;
                        break;
                   case 3:    //验证失败
                        //todo 界面处理
                        cancel = null;
                        break;
                   default:
                       super.handleMessage(msg);
             }

         };
       //对应不同的错误,可以有不同的操作
       private void handleErrorCode(int code) {
           switch (code) {
               case FingerprintManager.FINGERPRINT_ERROR_CANCELED:
                   //todo 指纹传感器不可用,该操作被取消
                   break;
               case FingerprintManager.FINGERPRINT_ERROR_HW_UNAVAILABLE:
                   //todo 当前设备不可用,请稍后再试
                   break;
               case FingerprintManager.FINGERPRINT_ERROR_LOCKOUT:
                   //todo 由于太多次尝试失败导致被锁,该操作被取消
                   break;
               case FingerprintManager.FINGERPRINT_ERROR_NO_SPACE:
                   //todo 没有足够的存储空间保存这次操作,该操作不能完成
                   break;
               case FingerprintManager.FINGERPRINT_ERROR_TIMEOUT:
                   //todo 操作时间太长,一般为30秒
                   break;
               case FingerprintManager.FINGERPRINT_ERROR_UNABLE_TO_PROCESS:
                   //todo 传感器不能处理当前指纹图片
                   break;
       }
    }

    展开全文
  • 在梳理支付宝指纹流程之前,先熟悉一下关于指纹解锁的知识。 指纹解锁的相关类位于 LocalAuthentication.framework 。这个库内容比较少,所以不是很复杂。主要方法如下 判断 TouchID 或者手机密码是否可用 - ...

    经常使用支付宝的的指纹登录,既安全,又方便。抽空就结合着指纹的相关知识,理了一下这个流程。

    在梳理支付宝指纹流程之前,先熟悉一下关于指纹解锁的知识。

    指纹解锁的相关类位于 LocalAuthentication.framework 。这个库内容比较少,所以不是很复杂。主要方法如下


    判断 TouchID 或者手机密码是否可用

    
    - (BOOL)canEvaluatePolicy:(LAPolicy)policy error:(NSError * __autoreleasing *)error __attribute__((swift_error(none)));
    
    

    其中:LAPolicy 是个枚举 :

    LAPolicyDeviceOwnerAuthenticationWithBiometrics
    
    指纹验证,三次验证不成功 就会自动取消验证
    
    注:这个时候可以再次被调起,但如果依然验证不通过,TouchID则会被锁定。
    

    LAPolicyDeviceOwnerAuthentication
    
    两次指纹匹配不成功,会自动弹出输入密码界面。
    
    注:当上面的TouchID多次不匹配,被锁定,无法调起的时候,我们可以调这个,会直接弹出输入密码的界面。
    

    Error 里包含的是错误码。通过error.code获取。

    我们常用的,也是比较重要的,有这两个code。(其他的具体可以参考 LAError 类)

    LAErrorAuthenticationFailed   -1
    
    LAErrorTouchIDLockout         -8
    
    其中:
    
    “-1”代表授权失败(当我们的指纹三次没有匹配成功的时候)。
    
    “-8”代表TouchID被锁定。(当返回“-1”后,我们再次掉起指纹验证,再次不匹配)
    
    注:对于一个App,并不是只有在返回“-1”之后才会返回“-8”。因为TouchID可能因为其他App无法验证被锁定,而导致我们的App直接返回“-8”。

    属性

    localizedCancelTitle:ALertView的左边标题 默认是取消
    
    localizedFallbackTitle :ALertView的右边标题 (一般设置为账号密码登录)
    

    在代码实现前,先分析一些支付宝指纹登录的流程。如图所示:
    这里写图片描述


    主要代码实现:

    导入头文件
    
    #import <LocalAuthentication/LocalAuthentication.h>
    

    初始化

    self.context = [[LAContext alloc] init];
    self.context.localizedCancelTitle = @"取消";
    self.context.localizedFallbackTitle = @"使用密码登录";
    
    [self loginWithTouchID];

    .

    单纯的使用TouchID登录,如果反复无法通过,就禁止再次使用TouchID。

    - (void)loginWithTouchID{
        NSError *error = nil;
        BOOL touchIDEnable =[self.context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error];
        if (touchIDEnable) {//TouchID 可用
            [self.context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"通过Home键验证已有手机指纹" reply:^(BOOL success, NSError * _Nullable error) {
                if (success) {
                    //进入登录
                }else{
                    if (error.code == LAErrorAuthenticationFailed) {
                        //提示指纹不匹配,等待用户再次点击指纹图标,进行另一种授权验证。
                    }
                    if (error.code == LAErrorTouchIDLockout) {
                        //TouchID被锁定,使用另一种授权方式进行登录
                         [self loginWithPhonePassword];
                    }
                }
            }];
        }else{
            //TouchID被锁定,使用另一种授权方式进行登录
            [self loginWithPhonePassword];
        }
    
    }
    

    .

    如果TouchID没有被锁定,会先弹出两次TouchID验证。都不通过的时候,会自动弹出输入iphone密码的界面。

    - (void)loginWithToucOrPhonePassword{
        NSError *error = nil;
    
        BOOL enable =[self.context canEvaluatePolicy:LAPolicyDeviceOwnerAuthentication error:&error];
        if (enable) {
            [self.context evaluatePolicy:LAPolicyDeviceOwnerAuthentication localizedReason:@"通过Home键验证已有手机指纹" reply:^(BOOL success, NSError * _Nullable error) {
                if (success) {
                    //进入登录
                }else{
                   NSLog(@"%ld",error.code);
                }
            }];
        }else{
            NSLog(@"%ld",error.code);
        }
    }
    

    另外,如果我们在设置中添加了新的TouchID,支付宝启动并没有做特别的变化。但在支付的时候,会检测到这一行为,让你手动输入支付密码。

    那么,当添加了新的TouchID时,为了安全,我们可能会取消App的指纹登录,采用App的普通账号密码登录,能实现么?当然是可以的。

    苹果提供了检测更新的字段:

    evaluatedPolicyDomainState 
    
    在我们通过 
    [self.context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error];
    检测TouchID是否可用后,
    
    我们可以通过 self.evaluatedPolicyDomainState 获取当前的一串这样的NSData:
    
    <3a6ebca2 b5366980 5c5a18e1 831f1f23 bff38c84 13fe93bc a305ef57 1a0efa2c>
    
    
    然后把它保存到起来,下次在获取到的时候,进行对比。如果不一样,则代表指纹发生了变化。
    
    展开全文
  • 微信支付/支付宝指纹支付原理

    万次阅读 2018-11-16 00:16:26
    随着各大厂商手机相继加入了指纹解锁功能,指纹支付因为免除了密码输入,简单快捷的特点,迅速受到了广大用户的青睐。今天我们简单来探究一下指纹支付的原理。   首先,我们先看看微信的指纹支付设置页面:点击...
  • Android手机指纹驱动工作原理

    千次阅读 2019-10-04 10:10:01
    Android手机指纹驱动工作原理
  • 问题 买了个小米笔记本,发现有个指纹识别(surprise??),虽然说有个libfprint 以及archlinux官方的fprintd可以读取指纹,但是...大概原理:因为第三方最新libfprint已经有了支持,但是arch所带的fprintd没有支持,...
  • 指纹识别-传感器原理

    千次阅读 2018-04-12 16:01:35
    其实传感器、芯片也要符合物理学的基本原理,他们都是物理学的原理的一种实现,我们可以从光、电、声、热、力这几个基本的物理研究领域中展开,看看今天主流的指纹识别传感器的分类和实现。 ...
  • 2017年9月13日,苹果召开发布会,发布的iPhone X支持Face ID登录解锁功能。 什么是face ID? 对,就是这个 一道光打在你半夜两点都不睡的修仙脸上的这个玩意儿。 当然,这只是让你明白face ID是怎么...
  • 基于stc51单片机的指纹解锁模块

    千次阅读 2020-07-06 12:35:12
    51单片机指纹解锁 main.c 文件 带注释 #include<reg52.h> #include<intrins.h> #include"buzz.h" #include"key.h" #include"uart.h" #include"delay.h" #include"FPM10A.h" #include"lcd_1602.h" #...
  • 本文就为大家整理了手机中常见的传感器,帮助大家了解其原理和用途。一、光线传感器:原理:光敏三极管,接受外界光线时,会产生强弱不等的电流,从而感知环境光亮度。用途:通常用于调节屏幕自动背光的亮度,白天...
  • 2013年Apple公司首次在iPhone5s增加了指纹识别系统,被称为touch ID,从此改变了人机交互的方式,直到今日,指纹识别仍然是最好用的解锁方式,只不过放的位置不同而已,有的放在了前面,有的放在了后面,指纹识别的...
  • Android开发学习—指纹识别系统的原理与使用

    万次阅读 多人点赞 2017-01-18 16:16:10
    指纹识别是什么?提到指纹识别我们就要先弄清楚什么事指纹指纹为何能够做到区别性。指纹,由于其具有终身不变性、唯一性和方便性,已几乎成为生物特征识别的代名词。指纹是指人的手指末端正面皮肤上凸凹不平产生的...
  • 为了保护用户隐私,如今的手机厂商都费尽心思,不断升级智能手机加密功能,现在有主流且安全性较高的解锁方式:指纹解锁,屏下指纹解锁、3D面部解锁,以及虹膜解锁。 智能手机配备物理指纹识别模块开始,厂商在解锁...
  • 继上一篇“Python人脸识别黑科技(一):50行代码运用Python+OpenCV实现人脸追踪+详细教程+快速入门+图像识”,那么今天我们来讲关于使用python+opencv+face++来实现人脸验证及人脸解锁。代码量同样不多,你可以将...
  • 指纹传感器和假指纹攻防技术

    千次阅读 2017-02-26 08:09:07
    雷锋网(公众号:雷锋网)按:我们在很早之前就有指纹传感和采集的需求,但直到20世纪59年代计算机发明后才实现了指纹识别的可能性。到70年代,美国FBI开启了一个项目,从而开启了用指纹识别来进行一些身份认证的工作...
  • 微信指纹原理及安全性分析

    千次阅读 2019-02-28 18:13:04
    在2015年10月推出了腾讯 SOTER解决方案,并且在2017年8月4日,腾讯SOTER...这里通过逆向对微信指纹原理和安全性做一个简单分析。1.微信指纹锁业务流程逻辑通过对微信指纹锁的逆向分析之后得出微信指纹锁的业务流...
  • 常见14种手机传感器

    万次阅读 2018-08-08 11:35:06
    手机传感器原理 https://jingyan.baidu.com/article/c35dbcb0fffe568916fcbc0c.html 传感器Sensor就是手机里那些可以被测量并且能按照一定的规律转换成可用输出信号的器件或装置。一般这类传感器都是由敏感元件...
  • 文章目录智能门锁一、项目背景二、项目功能要求三、元件准备四、项目设计(一)原理图设计(二)硬件设计(三)程序设计 智能门锁 资料链接 :stm32智能门锁.rar 哔哩哔哩项目展示视频:https://b23.tv/bxfxvd 一、...
  • 声纹锁和指纹锁有着异曲同工之妙,与指纹锁基于指纹识别技术不同的是,声纹锁是对于声音的技术识别,本文将为大家解释声纹锁识别的技术原理。 什么是声纹锁 声纹锁将声纹识别应用于门禁系统,实现传说中芝麻开门...
1 2 3 4 5 ... 20
收藏数 1,353
精华内容 541
关键字:

指纹解锁原理