我的应用程序的用户报告说,当我的应用程序正在侦听指纹身份验证(我已调用fingerprintManager.authenticate
)并且屏幕已关闭(通过按设备电源开关按钮)时,无法使用用于解锁设备的指纹。
我还可以看到在屏幕关闭时调用onAuthenticationError回调方法,这在我离开活动时不会发生,因为我在CancellationSignal.cancel()
方法中调用了onPause
。我已经检查过onPause
正在被调用。
在指纹对话框示例中可以观察到相同的行为(https://github.com/xamarin/monodroid-samples/tree/master/android-m/FingerprintDialog,移植自https://github.com/googlesamples/android-FingerprintDialog)
我该怎么做才能解决此问题?
编辑:我还尝试为on.Anup.action.CREEN_OFF注册一个广播接收器,它会在onPause之后得到通知,所以在接收器中调用cancel()
并没有改变任何东西也就不足为奇了。
答案 0 :(得分:6)
我的问题与您的问题类似:如果有人通过按Home键将我的应用程序发送到后台,它仍然可以控制指纹传感器,因此没有其他人可以使用它。从活动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
的{{1}}方法,而 onPause()
之前。否则你会收到警告
拒绝你的.package.name。 ;不在前台
cancelAuthentication():拒绝您的包名
我搜索过Android FingerPrint服务的源代码,我发现了这一行:
super.onPause()
其中canUseFingerprint实际上检查我们是前景还是否(它做的事情之一):
public void cancelAuthentication(final IBinder token, String opPackageName) {
if (!canUseFingerprint(opPackageName, false /* foregroundOnly */)) {
return;
}
//we don't get here
...
...
}
这样我们就永远不能从后台调用cancelAuth。并且Android认为我们在调用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
}
之后就处于后台。经过几个小时的研究,我发现的唯一解决方案是交换取消操作和super.onPause():
super.onPause();
在Android M和N上为我工作。希望这有帮助。
答案 1 :(得分:2)
我遇到过与Samsung Fingerprint SDK类似的行为(当屏幕被锁定或关闭时无法进行身份验证,它不是一个错误,它是设计的)。在审核了这种情况之后 - 我们得出结论,最好的方法是为用户创建一个包含PendingIntent的通知,该通知会触发您的应用并启动指纹认证过程。
通知可能会使手机振动/发出哔哔声,以便提醒用户。
希望这有帮助。
答案 2 :(得分:2)
在回调方法onError()中也调用' stopListeningc'。然后,当屏幕关闭时,应用程序中的指纹监听器将停止工作,然后您的设备将收听指纹。
希望这有帮助!