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

你是說我應該不得不在「FingerprintHandler」的'onAuthenticationSucceeded()'和'onAuthenticationFailed()'中繼續「繼續」,「循環」或「重新繼續」我的身份驗證?我該如何繼續並重振整個事情或處理回調?我不太熟悉這種異步回調。 – Cliff

+0

您可以根據所調用的回調方法確定要採取的操作。但它是一個異步操作,你不應該只是循環等待某件事情。 –