我正在编写一个应用程序,使用原生的android指纹api(在android 6.0及更高版本上)对用户进行身份验证。
在一种情况下-设备收到GCM通知,如果屏幕关闭但手机未锁定-应用程序通过启动带有以下标志的activity
来“唤醒”设备:
WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
然后,应用程序会显示一个对话框,要求用户使用手指进行身份验证。在这种情况下,不调用回调函数(从
FingerprintManager.AuthenticationCallback
-)代码如下:
fingerprintManager.authenticate(null, cancellationSignal, 0, new FingerprintManager.AuthenticationCallback() {
@Override
public void onAuthenticationError(int errorCode, CharSequence errString) {
super.onAuthenticationError(errorCode, errString);
logger.info("Authentication error " + errorCode + " " + errString);
...
}
@Override
public void onAuthenticationHelp(int helpCode, CharSequence helpString) {
super.onAuthenticationHelp(helpCode, helpString);
logger.info("Authentication help message thrown " + helpCode + " " + helpString);
...
}
@Override
public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) {
super.onAuthenticationSucceeded(result);
logger.info("Authentication succeeded");
...
}
/*
* Called when authentication failed but the user can try again
* When called four times - on the next fail onAuthenticationError(FINGERPRINT_ERROR_LOCKOUT)
* will be called
*/
@Override
public void onAuthenticationFailed() {
super.onAuthenticationFailed();
logger.info("Authentication failed");
...
}
}, null);
当屏幕打开和关闭时运行相同的代码,但是当屏幕关闭并由活动打开时,回调不会被调用。
有什么想法吗?
提前谢谢!
最佳答案
我注意到了同样的问题,在adb logcat
中我看到了下一行:
w/fingerprintmanager:身份验证已取消
我深入搜索了源代码,在FingerprintManager
中找到了以下函数:
if (cancel != null) {
if (cancel.isCanceled()) {
Log.w(TAG, "authentication already canceled");
return;
} else {
cancel.setOnCancelListener(new OnAuthenticationCancelListener(crypto));
}
}
这意味着,您正在使用已取消的
authenticate()
进入cancellationSignal
功能。只需在authenticate()
之前添加以下内容:if(cancellationSignal.isCanceled()){
cancellationSignal = new CancellationSignal();
}
这样,您将始终通过未取消的
cancellationSignal
,您的流程将是正确的。