0

私はthisのチュートリアルをフォローしています。今、私はユーザーの指紋を再認証できるように指紋認証部分をループしようとしています。私はonStart()とonCreate()のスレッドを使用して、whileループで認証しようとしましたが、どちらの場合でもアプリケーションが停止しています。一度だけのスレッドを使用するよりも他のメソッドは、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();} 

を失敗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); 

    } 

} 

スレッドを認証することができます

オリジナルのコードは、私もしようとしましたAsyncTaskを使用してwhileループを実行します。これはクラスを作成する私の試みです。私の問題は、CipherInit()がMainActivity.javaにあり、ループするクラスからメソッドを呼び出す方法です。

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操作であり、authが成功するか失敗するとハンドラ(FingerprintManager.AuthentciationCallback)が呼び出されます。 whileループでポーリングするのではなく、その成功/失敗に基づいて行動を起こす必要があります。そのコールバックはあなたのメインスレッドで発生します。

+0

あなたは 'FingerprintHandler'の' onAuthenticationSucceeded() 'と' onAuthenticationFailed() 'で私の認証を"続ける "か"ループ "または"再考 "する必要があると言っていますか?どうやってやり直したり、コールバックを処理したりすることができますか?私はこの非同期コールバックにあまり慣れていません。 – Cliff

+0

呼び出されるコールバックメソッドに基づいて実行するアクションを決定するのはあなた次第です。しかし、それは非同期操作です。何かを待つだけではいけません。 –

関連する問題