Как проверить, есть ли на устройстве функция отпечатка пальца, а затем использовать ее в Android

Я использую это разрешение

<uses-permission android:name="android.permission.USE_FINGERPRINT" />

чтобы проверить, есть ли на устройстве отпечаток пальца или нет. Вот как я проверяю это в котлине

val fingerSensorManager = FingerSensorManager(this)
fingerSensorManager.isFingerPrintAvailable()

Он отлично работает, но в Android 8 and above выдает исключение.

Как я могу проверить отпечаток пальца, а также использовать его во всех версиях? Я знаю, что есть другой метод для Android 8 и выше, но я не понимаю, как его реализовать, чтобы он работал на каждом устройстве.


person Zohab Ali    schedule 14.12.2018    source источник


Ответы (3)


НОВИНКА ДЛЯ API 28

AndroidManifest.xml

    <uses-permission android:name="android.permission.USE_FINGERPRINT"/>
<uses-permission android:name="android.permission.USE_BIOMETRIC"/>

Теперь вы можете использовать:

val executor = activity.mainExecutor
val cancelListener = DialogInterface.OnClickListener { _, _ -> })
val biometricPrompt = BiometricPrompt.Builder(context)
  .setTitle("Title")
  .setSubtitle("Subtitle")
  .setDescription("Description")
  .setNegativeButton("Cancel", executor, cancelListener)
  .build()

СЛЕДУЮЩИЙ КОД ПРЕДНАЗНАЧЕН ДЛЯ ВЕРСИИ НИЖЕ, ЧЕМ API 28

Этот класс устарел на уровне API 28. См. BiometricPrompt, который показывает системный диалог при запуске аутентификации. В мире, где устройства могут иметь различные типы биометрической аутентификации, гораздо более реалистично иметь диалоговое окно аутентификации, предоставляемое системой, поскольку метод может различаться в зависимости от поставщика/устройства.

Рекомендую прочитать эту тему:

Как добавить аутентификацию по отпечатку пальца в Android-приложение

Кроме того, следите за этой другой темой:

Как проверить совместимость устройства для аутентификации по отпечатку пальца в андроид

Вы должны добавить зависимость в свой файл «gradle».

compile "com.android.support:support-v4:23.0.0"

По сути, если я правильно понял ваш вопрос, вы хотите знать, есть ли у устройства оборудование и функции для отпечатков пальцев. Затем вы можете использовать:

// Check if we're running on Android 6.0 (M) or higher
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    //Fingerprint API only available on from Android 6.0 (M)
    FingerprintManager fingerprintManager = (FingerprintManager) context.getSystemService(Context.FINGERPRINT_SERVICE);
    if (!fingerprintManager.isHardwareDetected()) { 
        // Device doesn't support fingerprint authentication     
    } else if (!fingerprintManager.hasEnrolledFingerprints()) { 
        // User hasn't enrolled any fingerprints to authenticate with 
    } else { 
        // Everything is ready for fingerprint authentication 
    }
}

Не забудьте добавить разрешение на доступ к функциям отпечатков пальцев в AndroidManifest. Начиная с API 28:

<uses-permission android:name=" android.permission.USE_BIOMETRIC" />

До API28:

<uses-permission android:name="android.permission.USE_FINGERPRINT" />

Надеюсь, это поможет вам.

person MrMins    schedule 14.12.2018
comment
Это показывает, что FingerprintManager, isHardwareDetected() и hasEnrolledFingerprints() устарели в Java. - person Zohab Ali; 18.12.2018

о новая библиотека androidX это просто

BiometricManager.from(activity).canAuthenticate()

как говорится в документации

Возвращает BIOMETRIC_ERROR_NONE_ENROLLED, если у пользователя нет зарегистрированных, или BIOMETRIC_ERROR_HW_UNAVAILABLE, если ни один из них в настоящее время не поддерживается/включен. Возвращает BIOMETRIC_SUCCESS, если биометрические данные можно использовать в настоящее время (зарегистрированы и доступны). Значение: BIOMETRIC_SUCCESS, BIOMETRIC_ERROR_HW_UNAVAILABLE, BIOMETRIC_ERROR_NONE_ENROLLED или BIOMETRIC_ERROR_NO_HARDWARE.

person Antonis Radz    schedule 26.09.2019

Вы можете использовать биометрическую библиотеку от Androidx. Он все еще находится в альфе, но пока работает хорошо. Хорошо, что вам не нужны две реализации для определенного уровня Android API.

fun isAvailable(context: Context): Boolean {
    val fingerprintManager = FingerprintManagerCompat.from(context)
    return fingerprintManager.isHardwareDetected && fingerprintManager.hasEnrolledFingerprints()
}
person César Noreña    schedule 27.05.2019