5

Kiedy moja aplikacja uderza w "Zbyt wiele prób ...", błąd uwierzytelniania 0x7, FINGERPRINT_ERROR_LOCKOUT, jak mogę stwierdzić bez wywoływania funkcji FingerprintManager.authenticate() w pętli i otrzymania błędu, że warunek blokady został wyczyszczony?Jak programowo określić, kiedy wygasło hasło FINGERPRINT_ERROR_LOCKOUT w Android FIngerprintManager?

+0

Wśród wielu rzeczy, próbował próbował wywołać 'hasEnrolledFingerprints()' i 'isHardwareDetected()' podczas okresu blokady, aby sprawdzić, czy zwróci lub wyrzuci wyjątek. Nie ma szczęścia, te połączenia działają zgodnie z oczekiwaniami. – neuman8

+0

Czy znalazłeś rozwiązanie tego problemu? Chciałbym również poznać pozostały czas blokady i czy urządzenie jest zablokowane przed wywołaniem funkcji authenticate(). – Niels

+0

@Niels Nie śledziłem tego dłużej, ale szybkie przejrzenie najnowszej wersji kodu źródłowego FingerprintManager.java pokazuje mi coś takiego: 'public static abstract class LockoutResetCallback { // Wywoływane, gdy upłynął okres blokady, a klienci są dozwoleni ponownie słuchać odcisków palców. public void onLockoutReset() {} } ' – neuman8

Odpowiedz

0

Patrząc na wdrożenie systemu FingerprintService w systemie AOSP, faktycznie istnieje zamiar transmisji wysyłany po upływie okresu blokady. Intencją działania jest com.android.server.fingerprint.ACTION_LOCKOUT_RESET.

W swojej działalności, można zarejestrować odbiornik rozgłaszania i czekać na tej intencji, tak jak poniżej:

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

    ... 
} 

UWAGA: ten nie jest częścią publicznych API, więc takie zachowanie może się zmienić z dowolna późniejsza aktualizacja systemu operacyjnego. Ale spróbowałem tego na Nougacie i działa to całkiem dobrze.

referencyjny:

Odpowiedni kod AOSP jest ./frameworks/base/services/core/java/com/android/server/fingerprint/FingerprintService.java. W tym pliku, możemy znaleźć PendingIntent ze związkiem ACTION_LOCKOUT_RESET intencją tworzone:

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

Ten PendingIntent jest zarejestrowany do wyruszył po pewnym upływu czasu przez AlarmManager:

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

Próbowałem tego, ale po odebraniu transmisji urządzenie linii papilarnych nie reaguje na skanowanie odcisków palców. Musiałem ponownie uruchomić działanie, aby ponownie przeskanować. Ktoś widzi podobny problem? –

+0

@JeffreyLiu Po ​​zablokowaniu, musisz ponownie uruchomić menedżera urządzeń linii papilarnych. – hopia

+0

Jak ponownie uruchomić? @hopia –

Powiązane problemy