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?
cevap
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.
, 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:
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());
}
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ı? –
@JeffreyLiu Kilitlemeden sonra, Parmak İzi Aygıtı yöneticinizi yeniden başlatmanız gerekir. – hopia
Nasıl başlatılır? @hopia –
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
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
@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