5

Uygulamam "Çok Fazla Deneme Sayısı ...", kimlik doğrulama hatası 0x7, FINGERPRINT_ERROR_LOCKOUT, bir döngü içinde FingerprintManager.authenticate() çağırmadan ve kilitleme koşulu temizlenir hata alıyorum nasıl anlatabilirim?Android FIngerprintManager'da FINGERPRINT_ERROR_LOCKOUT süresi dolduğunda programlı bir şekilde nasıl söylenir?

+0

Ben Denendi, bir çeşit istisna döndürüp döndürmeyeceğini görmek için kilitleme süresi boyunca "hasEnrolledFingerprints()" ve 'isHardwareDetected()' yi çağırıyordu. Şanssızlık yok, bu çağrılar beklendiği gibi çalışıyor. – neuman8

+0

Bunun için bir çözüm buldunuz mu? Ayrıca, kalan kilitleme süresini ve cihaza authenticate() 'i çağırmadan önce kilitlendiğini bilmek isterim. – Niels

+0

@Niels Artık bunu izlemedim ancak FingerprintManager.java kaynak kodunun en son sürümüne hızlı bir bakış bana şöyle bir şey gösteriyor: "public static abstract class LockoutResetCallback { // Kilitlenme süresi dolduğunda ve istemcilere izin verildiğinde çağrılıyor tekrar parmak izi dinlemek için. public void onLockoutReset() {} } – neuman8

cevap

0

FingerprintService sisteminin AOSP uygulamasına bakıldığında, aslında kilitlenme süresinin sona ermesinden sonra gönderilen bir yayın hedefi vardır. Aramak için niyet eylemi com.android.server.fingerprint.ACTION_LOCKOUT_RESET'dur.

senin Bir Etkinlikte

, bir yayın alıcısı kayıt ve bu niyet bekleyin şöyle olabilir:

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

    ... 
} 

UYARI: bu ortak API parçası değildir ve bu nedenle, bu davranış ile değişebilir herhangi bir işletim sistemi güncellemesi. Ama Nougat'ta denedim ve benim için gayet iyi çalışıyor.

Referans:

ilgili AOSP kod ./frameworks/base/services/core/java/com/android/server/fingerprint/FingerprintService.java olduğunu. Bu dosyada, biz ACTION_LOCKOUT_RESET niyet yaratılan bir PendingIntent bulabilirsiniz:

Bu PendingIntent bazı geçen AlarmManager tarafından bir süre sonra yola edilecek kayıtlı olduğu
private PendingIntent getLockoutResetIntent() { 
    return PendingIntent.getBroadcast(mContext, 0, 
      new Intent(ACTION_LOCKOUT_RESET), PendingIntent.FLAG_UPDATE_CURRENT); 
} 

: çok şey arasında

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

Bunu denedim, ancak yayını aldıktan sonra, parmak izi aygıtı herhangi bir parmak izi taramasına tepki vermiyordu. Yeniden taramak için etkinliği yeniden başlatmam gerekiyordu. Benzer sorunu gören var mı? –

+0

@JeffreyLiu Kilitlemeden sonra, Parmak İzi Aygıtı yöneticinizi yeniden başlatmanız gerekir. – hopia

+0

Nasıl başlatılır? @hopia –