Quando la mia app visualizza "Troppi tentativi ...", errore di autenticazione 0x7, FINGERPRINT_ERROR_LOCKOUT, come posso dire senza chiamare FingerprintManager.authenticate() in un ciclo e ricevendo l'errore che la condizione di blocco è stata cancellata?Come dire programmaticamente quando FINGERPRINT_ERROR_LOCKOUT è scaduto su Android FIngerprintManager?
risposta
Guardando all'implementazione AOSP del sistema FingerprintService, esiste effettivamente un tentativo di trasmissione che viene inviato dopo la scadenza del periodo di blocco. L'azione intentata per cercare è com.android.server.fingerprint.ACTION_LOCKOUT_RESET
.
nella vostra attività, è possibile registrare un ricevitore broadcast e attendere questo intento, in questo modo:
public class MyActivity extends Activity {
...
private static final String ACTION_LOCKOUT_RESET =
"com.android.server.fingerprint.ACTION_LOCKOUT_RESET";
private final BroadcastReceiver mLockoutReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (ACTION_LOCKOUT_RESET.equals(intent.getAction())) {
doWhateverYouNeedToDoAfterLockoutHasBeenReset();
}
}
};
private void registerLockoutResetReceiver() {
Intent ret = getContext().registerReceiver(mLockoutReceiver, new IntentFilter(ACTION_LOCKOUT_RESET),
null, null);
}
public void onCreate(Bundle savedInstanceState) {
registerLockoutResetReceiver();
...
}
...
}
ATTENZIONE: questo non fa parte delle API pubblica e così, questo comportamento può cambiare con qualsiasi aggiornamento del sistema operativo successivo. Ma l'ho provato su Nougat e funziona abbastanza bene per me.
Riferimento:
Il codice AOSP rilevante è ./frameworks/base/services/core/java/com/android/server/fingerprint/FingerprintService.java. In questo file, possiamo trovare un PendingIntent
con una ACTION_LOCKOUT_RESET
intento in fase di creazione:
private PendingIntent getLockoutResetIntent() {
return PendingIntent.getBroadcast(mContext, 0,
new Intent(ACTION_LOCKOUT_RESET), PendingIntent.FLAG_UPDATE_CURRENT);
}
Questa PendingIntent è iscritto ad essere compensati dopo qualche tempo trascorso dalla AlarmManager:
private void scheduleLockoutReset() {
mAlarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime() + FAIL_LOCKOUT_TIMEOUT_MS, getLockoutResetIntent());
}
Ho provato questo, ma dopo aver ricevuto la trasmissione, il dispositivo di impronte digitali non reagirebbe a nessuna scansione delle impronte digitali. Ho dovuto riavviare l'attività per eseguire nuovamente la scansione. Qualcuno ha visto un problema simile? –
@JeffreyLiu Dopo il blocco, è necessario riavviare il gestore del dispositivo di impronte digitali. – hopia
Come si riavvia? @hopia –
- 1. Come posso sapere quando HttpClient è scaduto?
- 2. Invia email programmaticamente su Android
- 3. writeToFile come dire quando è completato
- 4. Assegnare un ID vista programmaticamente su Android
- 5. Fare clic programmaticamente su Notifica Android
- 6. Come avvisare quando Session (JWT) è scaduto in React/Redux
- 7. Disattiva programmaticamente le notifiche su Android
- 8. Come interrompere programmaticamente spotify quando arriva una chiamata su skype
- 9. Android: Ripple Background Programmaticamente
- 10. Android show tastiera programmaticamente
- 11. Come dire programmaticamente che Linux è in modalità PAE o non PAE?
- 12. Android: attivazione/disattivazione dell'hotspot WiFi programmaticamente su Android Marshmallow (6.0)
- 13. Come caricare il file animatore xml su Android programmaticamente?
- 14. Come effettuare videochiamate programmaticamente su Android 2.2 o versioni successive?
- 15. Android Studio - SDK è scaduto o mancante modelli
- 16. Android Layout peso programmaticamente
- 17. Fare musica programmaticamente su iPhone?
- 18. PHP max_execution_time non è scaduto
- 19. Android: Cancellare la cache programmaticamente
- 20. Come rifiutare una chiamata programmaticamente in Android
- 21. Android set forma XML come disegnabile programmaticamente
- 22. Come registrare programmaticamente PerformanceCounter
- 23. Gestione account manager android token scaduto
- 24. Ripristino di fabbrica Android Programmaticamente
- 25. Come si può dire programmaticamente all'interprete CPython di entrare in modalità interattiva una volta terminato?
- 26. Aggiungi layout con parametri programmaticamente Android
- 27. Come identificare se il token OAuth è scaduto?
- 28. CurlException: 28: connect() scaduto?
- 29. Come dire che l'attività è stata coperta dall'area di notifica?
Tra le tante cose che ho provato stava chiamando 'hasEnrolledFingerprints()' e 'isHardwareDetected()' durante il periodo di blocco per vedere se sarebbe ritornato o lanciato qualche sorta di eccezione. Non c'è fortuna, quelle chiamate funzionano come previsto. – neuman8
Hai trovato una soluzione per questo? Vorrei anche sapere il tempo di blocco rimanente e se il dispositivo è bloccato prima di chiamare authenticate(). – Niels
@Niels Non l'ho più seguito, ma una rapida occhiata all'ultima versione del codice sorgente di FingerprintManager.java mi mostra qualcosa del tipo: 'public static abstract class LockoutResetCallback { // Chiamato quando il periodo di blocco è scaduto e i client sono consentiti per ascoltare di nuovo le impronte digitali. public void onLockoutReset() {} } ' – neuman8