0

このチュートリアルに従っています。現在、ユーザーの指紋を再認証し続けることができるように、指紋認証部分をループしようとしています。認証を while ループするために 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 にあることと、ループ クラスからメソッドを呼び出すにはどうすればよいかということです。

ループする.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);

        }
    }
}}

主な活動

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

これは私の最初の個人的なプロジェクトであり、Android の構造全体についてはまだ比較的新しいものです。皆様からのご意見をお待ちしております。前もって感謝します

4

1 に答える 1

0

認証を行うためにセカンダリ スレッドやループは必要ありません。への呼び出しは、 (引用したチュートリアルと同じコードがあると仮定してFingerprintManager.authenticate()) で行われます。FingerprintHandlerこれは非同期操作であり、認証が成功または失敗すると、ハンドラー ( FingerprintManager.AuthentciationCallback) がコールバックされます。whileループでポーリングするのではなく、その成功/失敗に基づいてアクションを実行する必要があります。そのコールバックはメイン スレッドで発生します。

于 2016-07-29T11:38:56.937 に答える