如何使生物识别提示对话框不可取消?

13

我在我的应用程序中使用BiometricPrompt。当调用authenticate()方法时,它能够正常工作并显示对话框。但是当我点击对话框外部时,该对话框会关闭。如何防止这种情况发生?如何使BiometricPrompt的对话框不可取消?这里没有像biometricPrompt.setCancelable(false)这样的方法。


似乎该功能不可用,我建议使用自定义对话框来实现同样的目的。 - MadLeo
你尝试过 setCanceledOnTouchOutside(false) 吗? - Mehul Solanki
2
从文档中得知:在Android 9及更高版本中,FingerprintManager API已被弃用。如果您的捆绑和系统应用程序使用此API,请更新为使用BiometricPrompt。https://source.android.com/security/biometric - BArtWell
@MehulSolanki 我看到,没有这个名称可用的方法:https://developer.android.google.cn/reference/kotlin/androidx/biometric/BiometricPrompt - BArtWell
您可以在onAuthenticationError中处理错误代码BiometricPrompt.ERROR_USER_CANCELED。 - DAC84
4个回答

3

BiometricPrompt不允许这样做。因此,您无法使系统提供的生物识别提示无法取消。但是,您可以检测用户何时取消对话框。

因此,一种选择是在用户取消后再次显示生物识别提示(我认为这会是糟糕的用户体验),或者使用替代的用户身份验证方式:

override fun onAuthenticationError(errorCode: Int, errString: CharSequence) {
        if (errorCode == BiometricConstants.ERROR_USER_CANCELED) {
            // User canceled the operation

            // you can either show the dialog again here

            // or use alternate authentication (e.g. a password) - recommended way
        }
    }

如果指纹验证失败,我们能否提供替代身份验证方式?例如使用 Android 设备 PIN 从密钥库中检索密码? - user2234
1
是的,你可以。你可以打开密码/ PIN /模式屏幕并验证用户设备凭据。请查看此SO答案:https://dev59.com/cK7la4cB1Zd3GeqPg6du#52504424 - mgcaguioa
你应该使用setDeviceCredentialAllowed代替:https://developer.android.com/reference/androidx/biometric/BiometricPrompt.PromptInfo.Builder.html#setDeviceCredentialAllowed(boolean) - Kevin

0

看一下吧

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) {
    supportFragmentManager.fragments.forEach {
        if(it is DialogFragment) {
            it.dialog?.setCanceledOnTouchOutside(false)
        }
    }
}

生物识别提示并不一定是一个对话框,这取决于设备。例如,在OnePlus设备上,可能会显示全屏视图。 - Louis

0

仍然有一些设备存在这个问题。一个解决方法是获取根视图并添加一个点击方法设置为false的叠加视图。

    ViewGroup  viewGroup =  ((ViewGroup) yourActivity.findViewById(android.R.id.content)).getChildAt(0);

    //create your view
    Display display = mActivity.getWindowManager().getDefaultDisplay();
    Point size = new Point();
    display.getSize(size);
    View view = new View(yourActivity);
    view.setId(R.id.overlay_view);
    view.setLayoutParams(new ViewGroup.LayoutParams(size.x, size.y));
    view.setBackgroundColor(ContextCompat.getColor(yourActivity, R.color.black));
    view.setOnClickListener(v -> {
        //do nothing prevent click under this overlay
    });

    //add your view on top of the screen
    viewGroup.addView(view);

    //call your biometric dialog
    ....

    //on callbacks even if it is error or success call remove view
    viewGroup.removeView(view);

-4

您必须使用版本1.0.0-beta01或更高版本。

现在是默认行为:
触摸屏幕外部不再取消身份验证。仍然可以使用返回按钮取消身份验证。

您可以查看变更日志:

更改了行为,不允许通过触摸事件在提示框外部取消BiometricPrompt

您还可以检查审查报告
没有新的API。


FragmentManager在更新到1.0.1后已经执行事务错误。 - Amar Singh
嗨,Gabriele,你知道如何实现像onDismiss或onCancel监听器这样的东西吗?我想知道是否可能。 - Oleksandr Berdnikov
我已经尝试过v1.0.1和v1.1.0-alpha01版本。当我点击外部时,对话框会消失。任何帮助将不胜感激。 - Himanshu
因为在1.1.0-rc01版本中,当在提示框外部单击时,会使提示框消失,所以被踩了。 - Louis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接