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