Как использовать Biometric Prompt API в версиях ниже, чем Android 9.0

Я пытаюсь реализовать API-интерфейс для биометрической проверки подлинности пользователя с помощью проверки отпечатков пальцев. Я успешно могу интегрировать Биометрический запрос, и он работает над andorid 9.0. Но, как показывает документация, Biometric api также обратно совместим, но когда я создаю диалог, используя приведенный ниже код, он показывает предупреждение о поддержке API.

Для вызова требуется уровень API 28 (текущий минимум 15): новый android.hardware.biometrics.BiometricPrompt.Builder less... (Ctrl+F1) Эта проверка просматривает все вызовы API Android в приложении и предупреждает о любых вызовах, которые доступно не во всех версиях, на которые ориентировано это приложение (в соответствии с его минимальным атрибутом SDK в манифесте)

mBiometricPrompt = new BiometricPrompt.Builder(this)
                        .setDescription("Description")
                        .setTitle("Title")
                        .setSubtitle("Subtitle")
                        .setNegativeButton("Cancel", getMainExecutor(), new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialogInterface, int i) {
                                Log.i(TAG, "Cancel button clicked");
                            }
                        })
                        .build();

Что я могу сделать, чтобы это работало на более низких apis? Вот скриншот.

2 ответа

Решение

Похоже, что Biometric Prompt API для более старой версии все еще находится в альфа-версии. Если вы в порядке с альфа-версией, вы можете использовать это в build.gradle

compile group: 'androidx.biometric', name: 'biometric', version: '1.0.0-alpha02'

Источник: https://mvnrepository.com/artifact/androidx.biometric/biometric/1.0.0-alpha02

Здесь есть только две версии

  • 1.0.0-alpha01
  • 1.0.0-alpha02

Источник: https://mvnrepository.com/artifact/androidx.biometric/biometric

Согласно описанию библиотеки, это говорит

Биометрическая библиотека - это статическая библиотека, которую вы можете добавить в свое приложение Android. Он запускает BiometricPrompt на устройствах с P и выше, а на старых устройствах отображается диалоговое окно сравнения. Совместимо на устройствах с API 14 или более поздней версии.

Что означало бы, что все, что вам нужно, это библиотека Compat, и она будет работать на всех версиях Android. Не нужно оставлять две разные версии для Android 9 и выше, а Android 9 ниже.

Вот моя реализация для androidx.biometric, которую предложил Rohit5k2. Это Котлин, но я уверен, что это не будет проблемой. Надеюсь это поможет

fun FragmentActivity.auth(successCallback: () -> Unit, cancelSignal: CancellationSignal = CancellationSignal()) {
    if (Build.VERSION.SDK_INT < 23) {
        successCallback()
        return
    }

    val biometricPrompt = BiometricPrompt(this, MainThreadExecutor(), object : BiometricPrompt.AuthenticationCallback() {
        override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult) {
            super.onAuthenticationSucceeded(result)
            successCallback()
        }

        override fun onAuthenticationError(errorCode: Int, errString: CharSequence) {
            super.onAuthenticationError(errorCode, errString)
            if (errorCode == ERROR_NEGATIVE_BUTTON) {
                cancelSignal.cancel()
            }
        }
    })

    val promptInfo = BiometricPrompt.PromptInfo.Builder()
            .setTitle(getString(R.string.title))
            .setSubtitle(getString(R.string.auth))
            .setDescription(getString(R.string.biometric_desc))
            .setNegativeButtonText(getString(R.string.biometric_negative))
            .build()

    biometricPrompt.authenticate(promptInfo)
}

class MainThreadExecutor : Executor {
    private val handler = Handler(Looper.getMainLooper())

    override fun execute(r: Runnable) {
        handler.post(r)
    }
}

Если у вас есть старый проект Android (даже если это гибридное приложение Android), выполните следующие подробные шаги:

  1. Итак, у меня было старое приложение для гибридного Android-приложения Cordova. с помощью Android studio 3.2 . Версия Gradle сборки была очень старая, 2,8 и версия Gradle была 3,3.

  2. Я в первую очередь обновил Android Studio до последней версии 3.3.2

  3. Теперь я решил перенести весь проект на AndroidX. Помните, что это даже не позволит мне сделать это с предыдущей версией Android-студии, я не знаю почему.

  4. Когда я нажал на Refactor -> Migrate to AndroidX. Появилось всплывающее окно со словами: "Обновите версию Gradle. Поэтому теперь я обновил версию Gradle до 4.10.1, но все равно выдает ошибку, если я обновляю ее до 5,2 (я не знаю, почему, я все еще новичок в Android). Также обновлен построить gradle до 3.3.2

5. Мой build.gradle (модуль: приложение) выглядит так:

apply plugin: 'com.android.application'

buildscript {
    repositories {
        jcenter{ url "http://jcenter.bintray.com/" }
        google()
    }

    // Switch the Android Gradle plugin version requirement depending on the
    // installed version of Gradle. This dependency is documented at
    // http://tools.android.com/tech-docs/new-build-system/version-compatibility
    // and https://issues.apache.org/jira/browse/CB-8143
    dependencies {
        classpath 'com.android.tools.build:gradle:3.3.2'
        classpath "com.google.gms:google-services:3.0.0" //FCM Config

    }
   }
  1. Теперь приложение синхронизируется нормально, сборка в порядке. Я снова попробовал Refactor -> Migrate to androidX. На этот раз Android-студия начала рефакторинг кода и предоставила мне 70 предложений по изменению кода.

  2. Эти изменения кода в основном являются изменениями файла заголовка, такими как: import "" . Поэтому я открыл эту ссылку - https://developer.android.com/jetpack/androidx/migrate и изменил все операторы импорта на одинаковую статистику androidx.

  3. После копирования всех изменений я снова скомпилировал и синхронизировал код. после 3-х ресурсов и ошибки компиляции кода, я смог собрать код. Весь этот процесс занял 1,2 часа.

  4. Наконец я смог импортировать API поддержки биометрических данных в build-extras.gradle (Module: app), посмотрите на файл:

        dependencies {
            api 'androidx.appcompat:appcompat:1.0.2'
            api "com.squareup.picasso:picasso:2.4.0"
            api "com.google.android.material:material:1.1.0-alpha04"
            api "com.google.firebase:firebase-messaging:9.2.0" //FCM Config
            api 'com.rmtheis:tess-two:6.0.2'
            api 'com.github.bumptech.glide:glide:3.8.0'
            api 'androidx.legacy:legacy-support-v4:1.0.0'
    
            api "androidx.biometric:biometric:1.0.0-alpha03"
        }
    }
    
  5. Наконец, я смог собрать полный код и синхронизировать его. Так счастлив, наконец, сделал это. Теперь мне просто нужно использовать функции биометрического API, чтобы интегрировать его в мой код (обратите внимание, этот код был написан 3 года назад и предоставлен мне для интеграции новейшего биометрического API).

Да, мне нужен был пошаговый ответ, как этот.

Еще спасибо всем, кто помог.

Другие вопросы по тегам