0

Я следую this tutorial.Right сейчас, я пытаюсь зациклировать часть проверки подлинности отпечатка пальца, чтобы я мог сохранить повторную аутентификацию отпечатка пальца пользователя. Я попытался использовать поток в onStart() и onCreate() для циклического аутентификации, но приложение застряло в обоих случаях.Не удалось выполнить цикл в потоках onStart() и onCreate()

Оригинальный код, который может проходить проверку подлинности только один раз

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    fingerprintManager = (FingerprintManager) getSystemService(FINGERPRINT_SERVICE); 
    keyguardManager = (KeyguardManager) getSystemService(KEYGUARD_SERVICE); 

    if (!keyguardManager.isKeyguardSecure()){ 
     Toast.makeText(this, 
       "Lock screen security is not enable in Settings", Toast.LENGTH_LONG).show(); 
     return; 
    } 

    if (ActivityCompat.checkSelfPermission(this, 
      Manifest.permission.USE_FINGERPRINT) != PackageManager.PERMISSION_GRANTED){ 
     Toast.makeText(this, 
       "Fingerprint authentication permission is not enabled", Toast.LENGTH_LONG).show(); 
     return; 
    } 

    if (!fingerprintManager.hasEnrolledFingerprints()){ 
     Toast.makeText(this, "Register at least one fingerprint in Settings", Toast.LENGTH_LONG).show(); 
     return; 
    } 

    generateKey(); 
    if (cipherInit()){ 
     cryptoObject = new FingerprintManager.CryptoObject(cipher); 
     FingerprintHandler helper = new FingerprintHandler(this); 
     helper.startAuth(fingerprintManager, cryptoObject); 

    } 

} 

Нить в OnStart()/OnCreate(), что не удалось

@Override 
    protected void onStart() { 
     super.onStart(); 
     new Thread(new Runnable(){ 
     public void run() { 
      while(true) 
       { 
        try { 
        Thread.sleep(50); 
        if (cipherInit()) { 
         cryptoObject = new FingerprintManager.CryptoObject(cipher); 
         FingerprintHandler helper = new FingerprintHandler(MainActivity.this); 
         helper.startAuth(fingerprintManager, cryptoObject); 

       }} catch (InterruptedException e){ 
         e.printStackTrace(); 
      } 
     } 
    } 
}).start();} 

Другие, чем при использовании нити, я также пытался используйте AsyncTask, чтобы сделать цикл while для меня. Это моя попытка создать класс. Моя проблема в том, что cipherInit() находится в MainActivity.java и как я могу вызвать метод из моего класса Looping?

Looping.java

import android.hardware.fingerprint.FingerprintManager; 
    import android.os.AsyncTask; 

    public class Looping extends AsyncTask<Object,Void,Void> { 
     FingerprintManager fingerprintManager; 
     FingerprintManager.CryptoObject cryptoObject; 
     Cipher cipher; 
     @Override 
     protected Void doInBackground(Void... arg0) { 
      cipher = (Cipher) arg0[0]; 
      while(true) { 
       if (cipherInit()) { 
        cryptoObject = new FingerprintManager.CryptoObject(cipher); 
        FingerprintHandler helper = new FingerprintHandler(MainActivity.this); 
        helper.startAuth(fingerprintManager, cryptoObject); 

     } 
    } 
}} 

MainActivity

  Looping loop = new Looping(); 
      loop.execute(cipher, null, null); 

Это мой первый личный проект, и я все еще относительно новый со всей структурой Android. Я буду очень благодарен всем вам. Заранее спасибо

ответ

0

Для проверки подлинности вам не нужен вторичный поток или цикл. Вызов FingerprintManager.authenticate() выполняется в вашем FingerprintHandler (при условии, что у вас есть тот же код, что и указанный вами учебник). Это операция asyc, и обработчик (FingerprintManager.AuthentciationCallback) вызывается назад, когда auth преуспевает или терпит неудачу. Вам необходимо принять меры на основе этого успеха/неудачи, а не опроса в цикле while. Этот обратный вызов будет происходить в вашем основном потоке.

+0

Вы говорите, что мне нужно «продолжить» или «зациклировать» или «повторить» мою аутентификацию в 'onAuthenticationSucceeded()' и 'onAuthenticationFailed()' в 'FingerprintHandler'? Как я могу пойти и снова заново забрать все это или обработать обратный вызов? Я не очень хорошо знаком с этим асинхронным обратным вызовом. – Cliff

+0

Это зависит от вас, чтобы определить действие, которое должно быть выполнено на основе вызываемого метода обратного вызова. Но это асинхронная операция, вы никогда не должны просто зацикливаться на чем-то. –

Смежные вопросы