Сбой биометрической подсказки на Android 9 и 10 на некоторых устройствах

Я использую 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)

person nibz    schedule 25.09.2019    source источник


Ответы (3)


Попробуйте обновить зависимость, последняя версия на данный момент уже является кандидатом на выпуск:

implementation "androidx.biometric:biometric:1.0.0-rc01"
person Martin Zeitler    schedule 25.09.2019
comment
этот метод недоступен в AndroidX - person nibz; 25.09.2019
comment
androidx BiometricPrompt.java действительно не имеет его. Executor может уже быть null при построении, потому что это то место, где оно передается и где существует сообщение об ошибке Executor must not be null. - person Martin Zeitler; 25.09.2019
comment
Да, я согласен. Не знаю, как мне это исправить. По-видимому, я никогда не сталкивался с этой аварией, но многие устройства с Android 9 и 10 в производстве сталкиваются с этим - person nibz; 25.09.2019
comment
Вы можете проверить executor != null , прежде чем пытаться показать подсказку ... однако, при более внимательном рассмотрении трассировки стека, последняя строка по-прежнему android.hardware.biometrics.BiometricPrompt, а не _3 _... попробуйте версию 1.0.0-beta02. - person Martin Zeitler; 25.09.2019
comment
Спасибо, Мартин, я попробую и буду обновлять этот пост своими выводами. - person nibz; 25.09.2019
comment
В системе отслеживания проблем, похоже, нет такой ошибки. - person Martin Zeitler; 25.09.2019
comment
У меня аналогичная проблема, но исполнитель и обратный вызов, который я передаю, не равны нулю. stackoverflow.com/questions/58286606 / - person Balflear; 15.10.2019
comment
@MartinZeitler: проблема была исправлена, когда я обновился до последней версии 1.0.0-beta02, как вы предложили. Не могли бы вы обновить свой ответ, чтобы я мог его принять? - person nibz; 18.10.2019

Можете ли вы попробовать заменить Executor executor = Executors.newSingleThreadExecutor(); на:

private Handler handler = new Handler();

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

Это соответствует коду, приведенному на this developer.android.com. руководство.

person Vansh Arora    schedule 16.10.2019

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 и прикрепить образец приложения с ошибкой к общедоступной проблеме трекер?

person Kevin    schedule 26.09.2019