Как использовать 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), выполните следующие подробные шаги:
Итак, у меня было старое приложение для гибридного Android-приложения Cordova. с помощью Android studio 3.2 . Версия Gradle сборки была очень старая, 2,8 и версия Gradle была 3,3.
Я в первую очередь обновил Android Studio до последней версии 3.3.2
Теперь я решил перенести весь проект на AndroidX. Помните, что это даже не позволит мне сделать это с предыдущей версией Android-студии, я не знаю почему.
Когда я нажал на 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
}
}
Теперь приложение синхронизируется нормально, сборка в порядке. Я снова попробовал Refactor -> Migrate to androidX. На этот раз Android-студия начала рефакторинг кода и предоставила мне 70 предложений по изменению кода.
Эти изменения кода в основном являются изменениями файла заголовка, такими как: import "" . Поэтому я открыл эту ссылку - https://developer.android.com/jetpack/androidx/migrate и изменил все операторы импорта на одинаковую статистику androidx.
После копирования всех изменений я снова скомпилировал и синхронизировал код. после 3-х ресурсов и ошибки компиляции кода, я смог собрать код. Весь этот процесс занял 1,2 часа.
Наконец я смог импортировать 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" } }
Наконец, я смог собрать полный код и синхронизировать его. Так счастлив, наконец, сделал это. Теперь мне просто нужно использовать функции биометрического API, чтобы интегрировать его в мой код (обратите внимание, этот код был написан 3 года назад и предоставлен мне для интеграции новейшего биометрического API).
Да, мне нужен был пошаговый ответ, как этот.
Еще спасибо всем, кто помог.