gpt4 book ai didi

Android 指纹 api - FingerprintManager.AuthenticationCallback 未在 SCREEN_ON Intent 后调用

转载 作者:太空宇宙 更新时间:2023-11-03 13:47:45 25 4
gpt4 key购买 nike

我正在编写一个使用 native Android Fingerprint 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);

相同的代码在屏幕打开和关闭时运行,但当屏幕关闭和由 Activity 打开时 - 回调不会被调用。

有什么想法吗?提前致谢!

最佳答案

我注意到了同样的问题,在 adb logcat 中我看到了下一行:

W/FingerprintManager: authentication already canceled

我深入搜索了源代码,并在 FingerprintManager 中找到了以下函数:

if (cancel != null) {
if (cancel.isCanceled()) {
Log.w(TAG, "authentication already canceled");
return;
} else {
cancel.setOnCancelListener(new OnAuthenticationCancelListener(crypto));
}
}

这意味着,您正在使用已经取消 cancellationSignal 进入您的authenticate() 函数。只需在您的authenticate()之前添加以下内容:

if(cancellationSignal.isCanceled()){
cancellationSignal = new CancellationSignal();
}

这样您将始终传递未取消的 cancellationSignal 并且您的流程将是正确的。

关于Android 指纹 api - FingerprintManager.AuthenticationCallback 未在 SCREEN_ON Intent 后调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39215084/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com