Klim5198
@Klim5198
Человечище-минималист

Как сделать подтверждение действия с помощью biometrics (androidx.biometric:biometric:1.1.0)?

Я брал код с официального сайта: https://developer.android.com/training/sign-in/bio....

Ниже мой код, но он почти полностью копирует данный на сайте.
BiometricManager biometricManager = BiometricManager.from(getActivity().getApplicationContext());
        switch (biometricManager.canAuthenticate()) {
            case BiometricManager.BIOMETRIC_SUCCESS:
                // TODO: функция если всё ок
                Toast.makeText(getActivity().getApplicationContext(),
                        "You can use biometrics", Toast.LENGTH_SHORT).show();

                // make biometrics dialog
                executor = ContextCompat.getMainExecutor(getActivity().getApplicationContext());
                biometricPrompt = new BiometricPrompt(getActivity(), executor, new BiometricPrompt.AuthenticationCallback() {
                    @Override
                    public void onAuthenticationError(int errorCode, @NonNull CharSequence errString) {
                        super.onAuthenticationError(errorCode, errString);
                        Toast.makeText(getActivity().getApplicationContext(),
                                "Authentication error: " + errString, Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void onAuthenticationSucceeded(@NonNull BiometricPrompt.AuthenticationResult result) {
                        super.onAuthenticationSucceeded(result);
                        Toast.makeText(getActivity().getApplicationContext(),
                                "Authentication succeeded!", Toast.LENGTH_SHORT).show();
                        stat.setText("OK");
                        authResult = true;

                        Bundle bundle = new Bundle();
                        bundle.putBoolean("auth", authResult);
                        nextFragment.setArguments(bundle);
                    }

                    @Override
                    public void onAuthenticationFailed() {
                        super.onAuthenticationFailed();
                        Toast.makeText(getActivity().getApplicationContext(), "Authentication failed", Toast.LENGTH_SHORT).show();
                    }
                });

                // setup auth dialog
                promptInfo = new BiometricPrompt.PromptInfo.Builder()
                        .setTitle("Tittle | Biometric authentication")
                        .setSubtitle("SubTittle | Fingerprint or face")
                        .setDescription("Description")
                        .setNegativeButtonText("Cancel")
                        .build();
                break;
            case BiometricManager.BIOMETRIC_ERROR_NO_HARDWARE:
                // TODO: функция для тех, у кого нет датчиков
                Toast.makeText(getActivity().getApplicationContext(),
                        "This device don't have sensors", Toast.LENGTH_SHORT).show();
                break;
            case BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED:
                // TODO: функция для тех, у кого не настроены биометрические данные
                Toast.makeText(getActivity().getApplicationContext(),
                        "You don't have saved fingerprints or face, check your security settings", Toast.LENGTH_SHORT).show();
                break;
        }
//*********************************
biometricPrompt.authenticate(promptInfo);

Данный код может быть только в активности или фрагменте. Мне же нужно, чтобы считывание биометрических данных было, например, подтверждением удаления файла, отправки и т.п. Т.е. много случаев, когда нужно применить аутентификацию. Как сделать, чтобы не писать 1000 раз один и тот же код?
Я уже пробовал поместить данный код в любой публичный класс - не получается, не работает. Странная ошибка и связана с тем, что в классе не-активности, нельзя указать какой-либо класс активности И парадокс: один из методов должен принять в качестве аргумента тип Activity, но если через конструктор передать текущую активность и указать её в качестве аргумента, то ничего не работает. Sos me
  • Вопрос задан
  • 375 просмотров
Пригласить эксперта
Ответы на вопрос 1
@kaftanati
Инженер-энтузиаст
Так для инициализации и работы BiometricManager требуется ему передавать контект, полученый от активити - getActivity().getApplicationContext().

Самое простое - вынести этот кусок кода в отдельную функцию, которой и передавать контекст через аргуумент.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы