5

私のアプリが "Too Many Attempts ..."に当たったとき、認証エラー0x7、FINGERPRINT_ERROR_LOCKOUT、ループでFingerprintManager.authenticate()を呼び出しずにロックアウト条件がクリアされたというエラーをどうやって伝えることができますか?FINGERPRINT_ERROR_LOCKOUTがAndroid FIngerprintManagerで期限切れになったときにプログラムでどのように通知するのですか?

+0

多くのものの中で、私はロックアウト期間中に 'hasEnrolledFingerprints()'と 'isHardwareDetected()'を呼び出して、何らかの例外を返すかスローするかどうかを確認しようとしました。そこに運がない、それらの呼び出しは期待どおりに動作します。 – neuman8

+0

解決方法を見つけましたか?私はまた、残りのロックアウト時間と、デバイスがauthenticate()を呼び出す前にロックされているかどうかを知りたいと思います。 – Niels

+0

@Niels私はもうこれ以上追求していませんが、最新バージョンのFingerprintManager.javaソースコードを見ると、次のようなものが表示されます: 'public static abstract class LockoutResetCallback { //ロックアウト期間が切れてクライアントが許可されたときに呼び出されます再び指紋を聞く。 public void onLockoutReset(){} } – neuman8

答えて

0

システムFingerprintServiceのAOSP実装を見ると、実際には、ロックアウト期間が過ぎた後に送信されるブロードキャストインテントがあります。探しているインテントアクションはcom.android.server.fingerprint.ACTION_LOCKOUT_RESETです。あなたの活動に

、あなたは放送受信機を登録し、この目的のために待って、そのようなことができます。

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

    ... 
} 

WARNING:これはパブリックAPIの一部ではないので、この動作はして変更されることがありそれ以降のOSアップデート。しかし、私はノーガットでそれを試して、それは私のために非常にうまく動作します。

参考:

関連AOSPコードが./frameworks/base/services/core/java/com/android/server/fingerprint/FingerprintService.javaです。このファイルでは、我々は、作成中のACTION_LOCKOUT_RESET意図してPendingIntentを見つけることができます。

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

このPendingIntentはAlarmManagerによっていくつかの時間経過後にオフに設定されるように登録されている:

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

私はこれを試しましたが、ブロードキャストを受信した後、指紋デバイスはどの指紋スキャンにも反応しませんでした。私は再スキャンするために活動を再開しなければならなかった。誰も似たような問題を見ている? –

+0

@JeffreyLiuロックアウト後、指紋デバイスマネージャを再起動する必要があります。 – hopia

+0

どのように再起動しますか?@hopia –

関連する問題