4. Processo de gravação de impressões digitais
A atividade de gravação de impressão digital implementa a interface FingerprintEnrollSidecar.Listener para FingerprintEnrollEnrolling.
// Prompt durante a gravação de impressões digitais (como rápido demais, mova o dedo etc.)
@Sobrepor
public void onEnrollmentHelp (CharSequence helpString) {
mErrorText.setText (helpString);
}
// Indica que a gravação da impressão digital atingiu o tempo limite ou não está registrada.
@Sobrepor
public void onEnrollmentError (int errMsgId, CharSequence errString) {
int msgId;
......
showErrorDialog (getText (msgId), errMsgId);
......
}
// Alterações em andamento durante a gravação
@Sobrepor
public void onEnrollmentProgressChange (int steps, int restante) {
updateProgress (true / * animate * /); // Atualizar progresso
updateDescription (); // Atualizar descrição
animateFlash (); // Atualizar animação
......
}
O método onStart do FingerprintEnrollSidecar chama startEnrollment (), que chama o método de registro do FingerrollManager, e o objeto EnrollmentCallback é passado. EnrollmentCallback é o retorno de chamada do resultado da entrada de impressão digital e os métodos na interface FingerprintEnrollSidecar.Listener são chamados separadamente para que possam ser atualizados Progresso da gravação de impressões digitais e resultados da gravação.
private void startEnrollment () {
......
mFingerprintManager.enroll (mToken, mEnrollmentCancel,
0 / * sinalizadores * /, mUserId, mEnrollmentCallback);
mEnrolling = true;
}
private FingerprintManager.EnrollmentCallback mEnrollmentCallback
= new FingerprintManager.EnrollmentCallback () {
@Sobrepor
public void onEnrollmentProgress (int remanescente) {
......
mListener.onEnrollmentProgressChange (mEnrollmentSteps, restante);
}
}
@Sobrepor
public void onEnrollmentHelp (int helpMsgId, CharSequence helpString) {
if (mListener! = null) {
mListener.onEnrollmentHelp (helpString);
}
}
@Sobrepor
public void onEnrollmentError (int errMsgId, CharSequence errString) {
if (mListener! = null) {
mListener.onEnrollmentError (errMsgId, errString);
}
mEnrolling = false;
}
};
registro de cancelamento público (byte [] token, CancellationSignal cancel, int flags,
int userId, retorno de chamada EnrollmentCallback) {
......
mService.enroll (mToken, token, userId, mServiceReceiver, sinalizadores,
mContext.getOpPackageName ());
......
Preste atenção ao objeto mServiceReceiver de entrada.Este objeto enviará mensagens relacionadas através do manipulador para chamar os métodos em EnrollmentCallback ou AuthenticationCallback.
private IFingerprintServiceReceiver mServiceReceiver = novo IFingerprintServiceReceiver.Stub () {
@Override // binder call
public void onEnrollResult (long deviceId, int fingerId, int groupId, int restantes) {
mHandler.obtainMessage (MSG_ENROLL_RESULT, restante, 0,
nova impressão digital (null, groupId, fingerId, deviceId)). sendToTarget ();
}
@Override // binder call
public void onAcquired (long deviceId, intquireInfo) {
mHandler.obtainMessage (MSG_ACQUIRED, PurchaseInfo, 0, deviceId) .sendToTarget ();
}
@Override // binder call
public void onAuthenticationSucceeded (long deviceId, impressão digital fp, int userId) {
mHandler.obtainMessage (MSG_AUTHENTICATION_SUCCEEDED, userId, 0, fp) .sendToTarget ();
}
@Override // binder call
public void onAuthenticationFailed (long deviceId) {
mHandler.obtainMessage (MSG_AUTHENTICATION_FAILED) .sendToTarget () ;;
}
@Override // binder call
public void onError (long deviceId, int error) {
mHandler.obtainMessage (MSG_ERROR, erro, 0, deviceId) .sendToTarget ();
}
@Override // binder call
public void onRemoved (long deviceId, int fingerId, int groupId) {
mHandler.obtainMessage (MSG_REMOVED, fingerId, groupId, deviceId) .sendToTarget ();
}
};
public void handleMessage (mensagem do android.os.Message) {
switch (msg.what) {
caso MSG_ENROLL_RESULT:
sendEnrollResult ((Impressão digital) msg.obj, msg.arg1 / * restante * /);
quebrar;
caso MSG_ACQUIRED:
sendAcquiredResult ((Long) msg.obj / * deviceId * /,
msg.arg1 / * adquirir informações * /);
quebrar;
caso MSG_AUTHENTICATION_SUCCEEDED:
sendAuthenticatedSucceeded ((Impressão digital) msg.obj, msg.arg1 / * userId * /);
quebrar;
caso MSG_AUTHENTICATION_FAILED:
sendAuthenticatedFailed ();
quebrar;
caso MSG_ERROR:
sendErrorResult ((Long) msg.obj / * deviceId * /, msg.arg1 / * errMsgId * /);
quebrar;
caso MSG_REMOVED:
sendRemovedResult ((Long) msg.obj / * deviceId * /, msg.arg1 / * fingerId * /,
msg.arg2 / * groupId * /);
}
}
O FingerprintManager e o FingerprintService se comunicam diretamente por meio de ajuda.No FingerprintService, a classe interna FingerprintServiceWrapper implementa o IFingerprintService.Stub.O método de registro do Fingerroller que chamamos é o de register () na classe FingerprintServiceWrapper.
classe final privada FingerprintServiceWrapper estende IFingerprintService.Stub {
......
@Override // Chamada de fichário
registro público nulo (token IBinder final, byte final [] cryptoToken,
final int userId, receptor final IFingerprintServiceReceiver,
bandeiras finais do int,
final String opPackageName) {
checkPermission (MANAGE_FINGERPRINT);
limite final int = mContext.getResources (). getInteger (
com.android.internal.R.integer.config_fingerprintMaxTemplatesPerUser);
final int inscrito = FingerprintService.this.
getEnrolledFingerprints (userId) .size ();
if (inscrito> = limite) {
Slog.w (TAG, "Muitas impressões digitais registradas");
Retorna;
}
......
mHandler.post (novo Runnable () {
@Sobrepor
public void run () {
startEnrollment (token, cryptoToken, userId, receiver,
sinalizadores, restritos, opPackageName);
}
});
}
O método start de EnrollClient é chamado no método startEnrollment.O EnrollClient rastreia o status de gravação da impressão digital de um determinado cliente.
/ **
* Uma turma para acompanhar o estado da inscrição para um determinado cliente.
* /
classe abstrata pública EnrollClient estende o ClientMonitor {
......
public EnrollClient (contexto de contexto, long halDeviceId, token IBinder,
IFingerprintServiceReceiver, int userId, int groupId, byte [] cryptoToken,
booleano restrito, proprietário da string) {
super (contexto, halDeviceId, token, receptor, userId, groupId, restringido, proprietário);
......
}
@Sobrepor
public boolean onEnrollResult (int fingerId, int groupId, int remanescente) {
......
retornar sendEnrollResult (fingerId, groupId, restante);
}
/ *
* @return true se terminarmos.
* /
sendEnrollResult booleano privado (int fpId, int groupId, int remanescente) {
IFingerprintServiceReceiver receiver = getReceiver ();
......
receiver.onEnrollResult (getHalDeviceId (), fpId, groupId, restante);
......
}
@Sobrepor
public int start () {
Daemon IFingerprintDaemon = getFingerprintDaemon ();
......
resultado final int = daemon.enroll (mCryptoToken, getGroupId (), tempo limite);
......
retornar 0; // sucesso
}
O método start chamará fingerprintd e chamará a biblioteca de impressões digitais inferior.Depois que a biblioteca inferior retornar o resultado, chamaráEnrollResult para retornar o resultado ao receptor e enviar feedback para a camada superior. Este é o processo de gravação de impressões digitais.