5

Wenn meine App die "Too Many Attempts ...", Authentifizierungsfehler 0x7, FINGERPRINT_ERROR_LOCKOUT erreicht, wie kann ich sagen, ohne FingerprintManager.Authenticate() in einer Schleife aufzurufen und den Fehler zu erhalten, dass die Sperrbedingung gelöscht wird?Wie programmiere ich, wenn FINGERPRINT_ERROR_LOCKOUT im Android FinerprintManager abgelaufen ist?

+0

Unter den vielen Dingen, die ich probiert hat 'hasEnrolledFingerprints()' und 'isHardwareDetected()' während der Sperrperiode aufgerufen, um zu sehen, ob es eine Art von Ausnahme zurückgeben oder werfen würde. Kein Glück dort, diese Anrufe funktionieren wie erwartet. – neuman8

+0

Haben Sie eine Lösung dafür gefunden? Ich möchte auch die verbleibende Sperrzeit wissen und ob das Gerät vor dem Aufruf von authenticate() gesperrt ist. – Niels

+0

@Niels Ich habe das nicht mehr verfolgt, aber ein kurzer Blick durch die neueste Version des FingerprintManager.java Quellcodes zeigt mir so etwas: 'public static abstract Klasse LockoutResetCallback { // Wird aufgerufen, wenn die Sperrfrist abgelaufen ist und Clients erlaubt sind wieder auf den Fingerabdruck zu hören. public void onLockoutReset() {} } ' – neuman8

Antwort

0

Betrachtet man die AOSP-Implementierung des Systems FingerprintService, gibt es tatsächlich eine Broadcast-Absicht, die nach Ablauf der Sperrfrist gesendet wird. Die beabsichtigte Aktion ist com.android.server.fingerprint.ACTION_LOCKOUT_RESET.

In Ihrer Aktivität können Sie einen Rundfunkempfänger registrieren und zu diesem Zweck warten, etwa so:

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(); 
     ... 
    } 

    ... 
} 

ACHTUNG: dies ist nicht Teil der öffentlichen API und so kann dieses Verhalten bei ändern irgendein späteres OS-Update. Aber ich habe es auf Nougat versucht und es funktioniert ganz gut für mich.

Referenz:

Der relevante AOSP-Code ist ./frameworks/base/services/core/java/com/android/server/fingerprint/FingerprintService.java. In dieser Datei können wir eine PendingIntent mit einem ACTION_LOCKOUT_RESET Absicht wird erstellt finden:

private PendingIntent getLockoutResetIntent() { 
    return PendingIntent.getBroadcast(mContext, 0, 
      new Intent(ACTION_LOCKOUT_RESET), PendingIntent.FLAG_UPDATE_CURRENT); 
} 

Diese PendingIntent registriert nach einiger verstrichene Zeit von der Alarmmanager zu starten:

private void scheduleLockoutReset() { 
    mAlarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, 
      SystemClock.elapsedRealtime() + FAIL_LOCKOUT_TIMEOUT_MS, getLockoutResetIntent()); 
} 
+0

Ich habe das versucht, aber nachdem ich die Sendung empfangen habe, würde das Fingerabdruckgerät nicht auf Fingerabdrücke reagieren. Ich musste die Aktivität zum erneuten Scannen neu starten. Wer sieht ähnliches Problem? –

+0

@ JeffreyLiu Nach der Sperrung müssen Sie Ihren Fingerprint-Gerätemanager neu starten. – hopia

+0

Wie startet man neu? @hopia –