Ответ 1
Моя проблема похожа на вашу: если кто-то отправляет мое приложение на фоновое изображение, нажав кнопку "Домой", он все еще удерживает контроль над датчиком отпечатков пальцев, поэтому никто не может его использовать. Вызов отмены действий onPause() не работает:
@Override
protected void onPause() {
super.onPause();
/**
* We are cancelling the Fingerprint Authentication
* when application is going to background
*/
if (fingerprintHelper!=null && fingerprintHelper instanceof AndroidFingerprintHelper){
log.info("canceling AndroidFingerprintHelper dialog");
fingerprintHelper.cancelIdentify();
}
}
Вам нужно вызвать метод cancel()
вашего CancellationSignal
в вашем действии onPause()
, но до super.onPause()
. В противном случае вы получите предупреждение
Отклонение your.package.name.; не на переднем плане
cancelAuthentication(): отклонить имя вашего пакета
Я искал исходный код Android FingerPrint Service, и я нашел следующие строки:
public void cancelAuthentication(final IBinder token, String opPackageName) {
if (!canUseFingerprint(opPackageName, false /* foregroundOnly */)) {
return;
}
//we don't get here
...
...
}
где canUseFingerprint фактически проверяет, является ли мы передним или нет (одна из вещей, которые он делает):
private boolean canUseFingerprint(String opPackageName, boolean foregroundOnly) {
if (foregroundOnly && !isForegroundActivity(uid, pid)) {
Slog.v(TAG, "Rejecting " + opPackageName + " ; not in foreground");
return false;
}
//we don't get here
}
Таким образом, мы никогда не можем вызвать cancelAuth из фона. И Android думает, что мы находимся в фоновом режиме сразу после вызова super.onPause();
. После нескольких часов исследований единственным решением, которое я нашел, является замена действия cancel и super.onPause():
@Override
protected void onPause() {
/**
* We are cancelling the Fingerprint Authentication
* when application is going to background
*/
if (fingerprintHelper!=null && fingerprintHelper instanceof AndroidFingerprintHelper){
log.info("canceling AndroidFingerprintHelper dialog");
fingerprintHelper.cancelIdentify();
}
super.onPause();
}
Работал для меня на Android M и N. Hope, это помогает.