android xml 指纹动画,Android7.0 指纹framework流程及修改

回调流程

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):

若录入完成,将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);

}

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参数接口,所以自己提供一个获取方法。

新增enrollFingerId变量

private int enrollFingerId = -1;

新增getEnrollFingerId方法:

public int getEnrollFingerId() {

return this.enrollFingerId;

}

enroll方法重置enrollFingerId

public void enroll(byte[] token, CancellationSignal cancel, int flags, int userId, FingerprintManager.EnrollmentCallback callback) {

this.enrollFingerId = -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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值