Java 如何使用BiometricManager或BiometricPrompt检查生物识别硬件是否可用?

Java 如何使用BiometricManager或BiometricPrompt检查生物识别硬件是否可用?,java,android,kotlin,android-fingerprint-api,android-biometric-prompt,Java,Android,Kotlin,Android Fingerprint Api,Android Biometric Prompt,我正在使用BiometricPrompt类实现生物特征认证 在调用生物特征提示#authenticate方法之前,如何检查硬件是否可用 如何检查已注册的生物特征 如何调用biometricsmanager#canAuthenticate方法? 我无法在kotlin中为BiometricManager类创建对象 我当前的实现如下 val executor = Executors.newSingleThreadExecutor() val biometricPrompt = Bio

我正在使用BiometricPrompt类实现生物特征认证

  • 在调用
    生物特征提示#authenticate
    方法之前,如何检查硬件是否可用
  • 如何检查已注册的生物特征
  • 如何调用
    biometricsmanager#canAuthenticate
    方法? 我无法在kotlin中为BiometricManager类创建对象

    我当前的实现如下

        val executor = Executors.newSingleThreadExecutor()
    
        val biometricPrompt = BiometricPrompt(this, executor, object : BiometricPrompt.AuthenticationCallback() {
    
            override fun onAuthenticationError(errorCode: Int, errString: CharSequence) {
                super.onAuthenticationError(errorCode, errString)
                Log.d("BIOMETRIC", "$errString $errorCode")
    
                if (BiometricPrompt.ERROR_HW_NOT_PRESENT == errorCode || BiometricPrompt.ERROR_NO_BIOMETRICS == errorCode)
                    PreferenceHandler.setBiometricAvailable(this@LockActivity, false)
                else
                    PreferenceHandler.setBiometricAvailable(this@LockActivity, true)
            }
    
            override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult) {
                super.onAuthenticationSucceeded(result)
            }
    
            override fun onAuthenticationFailed() {
                super.onAuthenticationFailed()
                Log.d("BIOMETRIC", "FAILED")
            }
        })
    
        val promptInfo = BiometricPrompt.PromptInfo.Builder()
                .setTitle("App title")
                .setSubtitle("")
                .setDescription("Identify yourself by Biometrics")
                .setNegativeButtonText("Use Password")
                .build()
    
        biometricPrompt.authenticate(promptInfo)
    
    最后问题解决了

    androidx库中缺少生物特征管理器类

    androidx.biometric:biometric:1.0.0-alpha04
    
    将库版本更新为

    androidx.biometric:biometric:1.0.0-beta01
    
    现在您可以导入
    androidx.biometric.biometric管理器

    您可以检查生物识别硬件的可用性,并通过以下代码注册生物识别:

    object BiometricUtil {
    
    fun isHardwareAvailable(context: Context): Boolean{
        return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
            val bm = BiometricManager.from(context)
            val canAuthenticate = bm.canAuthenticate()
            !(canAuthenticate == BiometricManager.BIOMETRIC_ERROR_NO_HARDWARE || canAuthenticate == BiometricManager.BIOMETRIC_ERROR_HW_UNAVAILABLE)
    
        } else {
            false
        }
    }
    
    fun hasBiometricEnrolled(context: Context): Boolean {
        return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
            val bm = BiometricManager.from(context)
            val canAuthenticate = bm.canAuthenticate()
            (canAuthenticate == BiometricManager.BIOMETRIC_SUCCESS)
    
        } else {
            false
        }
    }
    }
    

    “我无法在kotlin中为BiometricManager类创建对象”您不应该创建实例。您应该调用
    getSystemService(Context.BIOMETRIC_SERVICE)
    @Michael getSystemService(Context.BIOMETRIC_SERVICE)并显示错误'ErrorConstant',它在API级别29上可用。如果您正在使用androidX支持库来支持较旧的API级别,请改用
    BiometricManager.from(someContext)
    。是的,我使用了androidX支持库
    androidX。生物识别:生物识别:1.0.0-alpha04
    在该库中,我找不到
    生物识别管理器。我认为这个版本有缺陷。今天他们发布了androidx。生物识别:生物识别:1.0.0-beta01
    。现在我可以导入
    androidx.biometric.biometric管理器
    。对于较低的API级别,应该不需要使用
    FingerprintManagerCompat
    <代码>生物特征管理器在内部为您执行此操作(至少是androidX支持库版本)。