如何确定设备是否具有显示屏生物特征指纹支持?

时间:2019-08-14 11:29:26

标签: android android-fingerprint-api in-display-fingerprint

我正在编写一个应用程序功能,以使用Biometric指纹认证API来认证用户。结合BiometricPrompt API可以正常工作。

通常会显示自己的UI对话框,因此可以在Android设备上进行统一。(Fingerprint Manager API的改进)

在一种设备测试方案中,我遇到了in-display(在屏幕上,例如Oneplus 6T设备)指纹支持,而不是背面生物识别硬件选项。

当我在其上运行应用程序时,在调用biometricPrompt.authenticate(..)而不是对话框时,它将显示显示指纹认证选项。可以,并通过BiometricPrompt的内部API进行管理。

但是它会为开发人员管理带来一些不一致。

  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.")
        }
    }
}

有关其外观的进一步参考,请找到以下附件。

enter image description here

我尝试检查锁定屏幕的相同情况,我猜想它使用了使用FingerPrintManager类和显示消息的自定义实现。

enter image description here

1 个答案:

答案 0 :(得分:-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" />