我的问题和你的类似:如果有人通过按下Home键将我的应用程序发送到后台,它仍然控制着指纹传感器,因此其他人无法使用它。从活动的onPause()中调用cancel并不起作用:
@Override
protected void onPause() {
super.onPause();
if (fingerprintHelper!=null && fingerprintHelper instanceof AndroidFingerprintHelper){
log.info("canceling AndroidFingerprintHelper dialog");
fingerprintHelper.cancelIdentify();
}
}
您需要在活动的
onPause()
方法中调用您的
CancellationSignal
的
cancel()
方法,但是要在
super.onPause()
之前。否则,您将收到以下警告:
Rejecting your.package.name. ; not in foreground
cancelAuthentication(): reject your package name
我已经搜索了 Android 指纹服务的源代码,并找到了这些代码行:
public void cancelAuthentication(final IBinder token, String opPackageName) {
if (!canUseFingerprint(opPackageName, false )) {
return;
}
...
...
}
canUseFingerprint实际上是检查我们是否在前台运行的(其中一件事情):
private boolean canUseFingerprint(String opPackageName, boolean foregroundOnly) {
if (foregroundOnly && !isForegroundActivity(uid, pid)) {
Slog.v(TAG, "Rejecting " + opPackageName + " ; not in foreground");
return false;
}
}
这样我们就不能从后台调用cancelAuth。而且在调用super.onPause()
之后,Android认为我们处于后台状态。经过几个小时的研究,我找到的唯一解决方案是交换取消操作和super.onPause()
的位置:
@Override
protected void onPause() {
if (fingerprintHelper!=null && fingerprintHelper instanceof AndroidFingerprintHelper){
log.info("canceling AndroidFingerprintHelper dialog");
fingerprintHelper.cancelIdentify();
}
super.onPause();
}
在 Android M 和 N 上对我有用。希望这可以帮到你。