回调流程
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;
}
网友评论