Как определить, поддерживает ли устройство биометрические отпечатки пальцев на дисплее?

Я пишу функцию приложения для аутентификации пользователя с помощью биометрического API аутентификации по отпечатку пальца. . И он работал, как и ожидалось, с использованием API BiometricPrompt.

Как правило, он отображает собственное диалоговое окно пользовательского интерфейса, поэтому его можно унифицировать на всех устройствах Android. Диспетчер отпечатков пальцев API)

В одном из сценариев тестирования устройств я обнаружил in-display (на экран, например устройство Oneplus 6T) поддержка отпечатков пальцев вместо задней биометрической аппаратной опции.

Когда я запускаю на нем приложение, при вызове biometricPrompt.authenticate(..) вместо диалога отображается опция аутентификации по отпечатку пальца на дисплее. Это нормально и управляется внутренним API BiometricPrompt.

Но это создает некоторую несогласованность для разработчика.

  1. Когда он предоставляет встроенный диалог аутентификации, все резервные ошибки отображаются в самом диалоге.
  2. Но в случае проверки подлинности на дисплее я не нашел способа, которым ему удается отображать сообщение об ошибке. И я должен обрабатывать этот запасной вариант и отображать его по-своему.

Теперь вопрос

  1. Есть ли способ управлять/отображать сообщение с помощью компонента представления проверки подлинности на дисплее.
  2. Как определить, поддерживает ли устройство встроенную биометрическую аутентификацию.

Изменить: я использую ссылку на код:

import android.content.Context
import androidx.biometric.BiometricPrompt
import androidx.fragment.app.FragmentActivity
import java.lang.Exception
import java.util.concurrent.Executors
import javax.crypto.Cipher

class BiometricAuthenticationManager(private val context: Context) :
        BiometricPrompt.AuthenticationCallback() {

    private var biometricPrompt: BiometricPrompt? = null

    override fun onAuthenticationError(errorCode: Int, errString: CharSequence) {
        super.onAuthenticationError(errorCode, errString)
        biometricPrompt?.cancelAuthentication()
    }

    override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult) {
        super.onAuthenticationSucceeded(result)

    }

    override fun onAuthenticationFailed() {
        super.onAuthenticationFailed()
    }

    fun init(cipher: Cipher, promptInfo: BiometricPrompt.PromptInfo) {
        if (context is FragmentActivity) {
            val executor = Executors.newSingleThreadExecutor()

            biometricPrompt = BiometricPrompt(context, executor, this)
            biometricPrompt?.authenticate(promptInfo, BiometricPrompt.CryptoObject(cipher))
        } else {
            throw Exception(
                    "Check for FragmentActivity context.")
        }
    }
}

Для получения дополнительной информации о том, как это выглядит, пожалуйста, найдите следующее приложение.

введите описание изображения здесь

Я пытаюсь проверить тот же сценарий для экрана блокировки, где, я думаю, он использует пользовательскую реализацию с использованием класса FingerPrintManager и отображает сообщение.

введите описание изображения здесь


person CoDe    schedule 14.08.2019    source источник
comment
Как определить, поддерживает ли устройство биометрическую аутентификацию внутри устройства — это кажется неправильным вопросом. Исходя из вашей проблемы, проблема не в том, является ли это детектором отпечатков пальцев на экране, а в том, обрабатываются ли сообщения об ошибках для вас. Хотя экранные детекторы отпечатков пальцев могут быть более склонны к такого рода проблемам, технически они не связаны между собой. Например, та же проблема может возникнуть с устройствами сканирования радужной оболочки глаза. Возможно, вы захотите включить минимально воспроизводимый пример, показывающий ваш код, и скриншоты, демонстрирующие разницу в поведении.   -  person CommonsWare    schedule 14.08.2019
comment
Кстати, вы можете попробовать androidx версию BiometricPrompt и посмотреть, изменит ли она поведение.   -  person CommonsWare    schedule 14.08.2019
comment
Положение датчика отпечатков пальцев определяется производителем конкретного устройства. цель API — аутентифицировать нужного пользователя. поэтому проверка биометрических данных на дисплее кажется мне невозможной с API по умолчанию.   -  person Sahil Manchanda    schedule 14.08.2019
comment
@CommonsWare, я проверил с компонентом androidX (фактически он должен использоваться для поддержки работающих версий ниже Android P), но это не имеет никакого значения. О том, поддерживает ли устройство биометрическую аутентификацию в устройстве, это последний вариант, который я ищу, поэтому я могу поставить if-else, когда нужно отображать ошибки в пользовательском интерфейсе, когда он будет обрабатываться самим диалоговым компонентом SDK.   -  person CoDe    schedule 16.08.2019
comment
@SahilManchanda, правда. Но вы видите проблему: при использовании новейшего биометрического API с задним датчиком отображается диалоговое окно, которое может обрабатывать ошибки. Но при использовании того же API с датчиком на дисплее сообщение об ошибке не отображается. Есть ли у вас какие-либо находки вокруг?   -  person CoDe    schedule 21.08.2019
comment
@CoDe У тебя есть какие-нибудь находки? А. нет. сегодня посмотрю   -  person Sahil Manchanda    schedule 21.08.2019
comment
Вы можете использовать метод BiometricManager.canAuthenticate().   -  person Gabriele Mariotti    schedule 31.08.2019
comment
У меня есть OnePlus с Android 10, и он анимирует диалог. Вы можете ожидать, что OEM реализует обработку ошибок, например. тактильная обратная связь вместо текста.   -  person Gabor    schedule 12.09.2019
comment
правда, но для меня проблема связана с отображением ошибки, когда он отображает отпечаток пальца (или когда в случае, если он не отображает диалоговое окно отпечатка пальца), потому что в случае диалогового отображения sdk он сам отображается в диалоговом окне.   -  person CoDe    schedule 12.09.2019
comment
@CoDe есть решение этой проблемы?   -  person Cosmic Dev    schedule 09.06.2020
comment
@CosmicDev пока ничего. Но вы можете поделиться своим вариантом использования, и я могу помочь вам найти возможное решение.   -  person CoDe    schedule 16.06.2020
comment
Он не отображается в одном плюс 6т   -  person Cosmic Dev    schedule 16.06.2020
comment
Веская причина, если вы используете объект строгой биометрической аутентификации (с использованием криптографии) и не зарегистрировали отпечаток пальца в настройках устройства. Я не уверен, какую версию библиотеки вы используете, но последней является androidx.biometric: биометрический: 1.0.1 .   -  person CoDe    schedule 18.06.2020
comment
Я сталкиваюсь с похожей, но немного другой проблемой с датчиком отпечатков пальцев на экране (на моем OP7T). В случае неправильного отпечатка пальца реализация по умолчанию показывает отрицательное сообщение, которое я установил, и просто ждет и продолжает принимать отпечатки пальцев. Но в случае OP7T неправильный отпечаток пальца просто вызывает тактильную обратную связь (вибрацию) и закрывает диалоговое окно, даже не вызывая «onAuthenticationError», а когда я нажимаю «Назад», он фактически вызывает «onAuthenticationError». @CoDe, вы столкнулись с похожей проблемой .. постараюсь изучить мою и вашу проблему, опубликую, если что-нибудь найду.   -  person Malay Shah    schedule 20.06.2020
comment
Второй сценарий выглядит странно, но в целом существует ограничение на максимальную неправильную попытку, которую пользователь может выполнить после этого, он не позволяет (даже любому другому приложению) использовать биометрию до тех пор, пока пользователь снова не заблокирует и не разблокирует устройство. Также обратите внимание, что базовый слой может быть изменен OEM-поставщиком (например, Samsung), так что это может быть проблемой конкретного устройства.   -  person CoDe    schedule 23.06.2020
comment
@CoDe Его глючная реализация Oneplus Oxygen OS. проверьте ответ pommytom на форуме OnePlus, он довольно хорошо объяснил это, а также упомянул некоторые обходные пути: forums.oneplus.com/threads/, насколько я предлагаю, вы можете показать Toast onAuthenticationFailed(), это не будет таким же, как ответ на отказ LockScreen, но он может учитывать и обходной путь.   -  person Malay Shah    schedule 28.06.2020


Ответы (1)


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 
    }
}

Не забудьте добавить

<uses-permission android:name=" android.permission.USE_BIOMETRIC" />
person Vijay S    schedule 14.07.2021
comment
Я не понимаю, как это отвечает на вопрос. Вопрос не в том, как проверить, поддерживается ли аутентификация по отпечатку пальца; это проверить, расположен ли датчик отпечатков пальцев на дисплее (а не где-то еще, например, на задней панели устройства). - person Michael; 16.07.2021
comment
@Vijay, вопрос о том, чтобы определить, поддерживает ли устройство биометрические отпечатки пальцев на дисплее или нет. Пожалуйста, улучшите свой ответ - person Waseem; 02.08.2021