【问题标题】:Biometric Prompt crashing on Android 9 and 10 on some devices生物识别提示在某些设备上的 Android 9 和 10 上崩溃
【发布时间】:2019-10-18 06:39:20
【问题描述】:

我正在使用 BiometricPrompt 让用户使用指纹身份验证登录应用程序 我在 PasswordActivity 类中完成了以下操作:

     Executor executor = Executors.newSingleThreadExecutor();

    FragmentActivity activity = this;

    final BiometricPrompt biometricPrompt = new BiometricPrompt(activity, executor, new BiometricPrompt.AuthenticationCallback() {
        @Override
        public void onAuthenticationError(int errorCode, @NonNull CharSequence errString) {
            super.onAuthenticationError(errorCode, errString);
            if (errorCode == BiometricPrompt.ERROR_NEGATIVE_BUTTON) {
                // user clicked negative button
            } else {
                //TODO: Called when an unrecoverable error has been encountered and the operation is complete.
            }
        }

        @Override
        public void onAuthenticationSucceeded(@NonNull BiometricPrompt.AuthenticationResult result) {
            super.onAuthenticationSucceeded(result);
            //TODO: Called when a biometric is recognized.
            final String decryptedText = decryptText();
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    if (decryptedText != null && !decryptedText.isEmpty()) {
                        editPassword.setText(decryptedText);
                        buttonNext();
                    }
                }
            });

        }

        @Override
        public void onAuthenticationFailed() {
            super.onAuthenticationFailed();
            //TODO: Called when a biometric is valid but not recognized.
        }
    });

    final BiometricPrompt.PromptInfo promptInfo = new BiometricPrompt.PromptInfo.Builder()
            .setTitle("My App"))
            .setSubtitle("Log on into the app"))
            .setNegativeButtonText("Cancel").toUpperCase())
            .build();

    if (sharedPreferenceManager.isFingerprintEnabled(this))
        biometricPrompt.authenticate(promptInfo);   

这是我得到的例外。我必须设置吗?

setNegativeButton (CharSequence text, 
            Executor executor, 
            DialogInterface.OnClickListener listener) as well?

我正在使用实现 'androidx.biometric:biometric:1.0.0-alpha03' 这个版本。

Caused by java.lang.IllegalArgumentException: Executor must not be null
   at android.hardware.biometrics.BiometricPrompt$Builder.setNegativeButton + 182(BiometricPrompt.java:182)
   at androidx.biometric.BiometricFragment.onCreate + 201(BiometricFragment.java:201)
   at androidx.fragment.app.Fragment.performCreate + 2414(Fragment.java:2414)
   at androidx.fragment.app.FragmentManagerImpl.moveToState + 1418(FragmentManagerImpl.java:1418)
   at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState + 1784(FragmentManagerImpl.java:1784)
   at androidx.fragment.app.FragmentManagerImpl.moveToState + 1861(FragmentManagerImpl.java:1861)
   at androidx.fragment.app.FragmentManagerImpl.dispatchStateChange + 3269(FragmentManagerImpl.java:3269)
   at androidx.fragment.app.FragmentManagerImpl.dispatchCreate + 3223(FragmentManagerImpl.java:3223)
   at androidx.fragment.app.FragmentController.dispatchCreate + 190(FragmentController.java:190)
   at androidx.fragment.app.FragmentActivity.onCreate + 369(FragmentActivity.java:369)
   at androidx.appcompat.app.AppCompatActivity.onCreate + 85(AppCompatActivity.java:85)

【问题讨论】:

    标签: android android-biometric-prompt android-biometric


    【解决方案1】:

    您可以尝试将Executor executor = Executors.newSingleThreadExecutor(); 替换为:

    private Handler handler = new Handler();
    
    private Executor executor = new Executor() {
        @Override
        public void execute(Runnable command) {
            handler.post(command);
        }
    };
    

    这是根据thisdeveloper.android.com教程中给出的代码。

    【讨论】:

      【解决方案2】:

      尝试更新依赖,当前最新版本已经是候选版本:

      implementation "androidx.biometric:biometric:1.0.0-rc01"
      

      【讨论】:

      • 此方法在AndroidX中不可用
      • androidx BiometricPrompt.java 确实没有。构造时Executor 可能已经是null,因为这是传递它的位置,并且存在错误消息Executor must not be null
      • 是的,我同意。不知道我应该如何解决这个问题。显然我从来没有遇到过这种崩溃,但是很多使用 Android 9 和 10 的设备都面临着这些
      • 您可以在尝试显示提示之前检查是否executor != null ...但是,当仔细查看堆栈跟踪时,最后一行仍然是android.hardware.biometrics.BiometricPrompt 而不是@ 987654329@...尝试版本1.0.0-beta02
      • 谢谢马丁,我会试试看,并根据我的发现更新这篇文章
      【解决方案3】:
      Caused by java.lang.IllegalArgumentException: Executor must not be null
         at android.hardware.biometrics.BiometricPrompt$Builder.setNegativeButton + 182(BiometricPrompt.java:182)
      

      这表明您正在测试的设备上的框架没有从支持库接收执行程序(支持库中的错误),或者框架本身存在错误。

      您可以尝试使用更高版本的 androidx.biometric 库吗? Beta02 刚刚发布,从 alpha03 开始​​修复了很多东西。

      另外,您正在测试什么设备,如果它可以在 Beta02 上重现,您能否通过 adb bugreport foo.zip 获取错误报告并将您的示例应用程序与该错误附加到公共问题 tracker

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-05-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-25
        • 1970-01-01
        相关资源
        最近更新 更多