美文网首页
Android7.0 指纹framework流程及修改

Android7.0 指纹framework流程及修改

作者: RhythmCoderZZF | 来源:发表于2019-04-09 18:04 被阅读0次

回调流程

FingerprintService启动同时启动FingerprintDaemon并传入核心回调接口——IFingerprintDaemonCallback(8.1是IBiometricsFingerprintClientCallback)
该接口用于向ClientMonitor的4大实现类分发回调事件。

  • AuthenticationClient:指纹验证
  • 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);
                }
            });
        }
    };

各个client接收到回调事件,则会调用第二个接口FingerprintServiceReceiver

2. FingerprintServiceReceiver

FingerprintServiceReceiver是FingerprintManager中总的回调接口,用于回调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();
        }
    };

录入指纹流程:

调用:

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) {
       }
      

-> 初始化一个EnrollClient,调用startClient()
->client.start()
-> daemon.enroll(mCryptoToken, getGroupId(), timeout)开始录入
(FingerprintManager中回调接口IFingerprintServiceReceiver会保存在EnrollClient中以待回调)

回调:

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,若没有则初始化一个UserState。
        //构造方法中会根据该userId查询之前保存的指纹File(xml),初始化一个mFingerprints集合。
        
        //#3:addFingerprint:添加进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);
            }

    }

验证指纹流程:

调用:

FingerprintManager.authenticate(userId,receiver,...)
->service.authenticate (userId,receiver,...)
->初始化一个AuthenticationClient , 调用startClient(userId,receiver,...)
->client.start()
->daemon.authenticate(mOpId, getGroupId())开始验证
(FingerprintManager中回调接口IFingerprintServiceReceiver同样会保存在AuthenticationClient中以待回调)

回调:

IFingerprintDaemonCallback
->onAuthenticated(fingerid ,deviceid,groupid,token)
->client.onAuthenticated

  • client.onAuthenticated:
    根据指纹结果回调Receiver中的onAuthenticationSucceeded,onAuthenticationFailed等方法。

修改

enroll录入

因为EnrollmentCallback没有获取正在录制的指纹id参数接口,所以自己提供一个获取方法。

  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验证

因为在AuthenticationClient.onAuthenticated(int fingerId, int groupId)中isRestricted=true,从而在FingerprintManager的AuthenticationCallback.onAuthenticationSucceeded参数中的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;
        }

相关文章

网友评论

      本文标题:Android7.0 指纹framework流程及修改

      本文链接:https://www.haomeiwen.com/subject/esmqvqtx.html