如何使BiometricPrompt无法取消?

时间:2019-06-06 10:16:44

标签: android androidx android-biometric-prompt

我在应用程序中使用BiometricPrompt。调用authenticate()方法时,它可以很好地工作并显示对话框。但是,当我在对话框外部单击时,此对话框将关闭。怎么预防呢?如何使BiometricPrompt的对话框不可取消?这里没有像biometricPrompt.setCancelable(false)这样的方法。

4 个答案:

答案 0 :(得分:1)

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

现在是默认行为:
外部触摸不再取消身份验证。后退按钮仍会取消身份验证。

您可以看到changelog:

  

更改了行为,不允许提示外的触摸事件取消BiometricPrompt

您还可以检查rewiew report
没有新的API。

答案 1 :(得分:0)

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
        }
    }

答案 2 :(得分:0)

签出

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

答案 3 :(得分:0)

有些设备仍然存在此问题。一种解决方法是获取根视图并添加一个将clickable方法设置为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);