6

在 Android BiometricPrompt中,提示已替换已弃用的FingerprintManager。FingerPrintManager 有两个功能hasEnrolledFingerprints()isHardwareDetected()检查设备是否支持指纹以及用户是否注册了任何指纹认证。

使用新的 BiometricPrompt 似乎没有功能可以在不尝试提示 BiometricPrompt 的情况下检查这一点。有BiometricPrompt.AuthenticationCallback.onAuthenticationError(一个错误代码调用,指示设备是否支持生物识别以及用户是否注册了生物识别认证。

因此,如果我尝试从用户那里进行身份验证,我只能获取此信息。有没有办法在不尝试提示身份验证的情况下进行检查以检查设备是否支持生物识别并且用户已注册它们?

4

6 回答 6

9

添加了AndroidX Biometric beta01 BiometricManager.canAuthenticate(int)(以前BiometricManager.canAuthenticate()

在应用程序模块的 build.gradle 文件中使用以下依赖项。

implementation 'androidx.biometric:biometric:1.1.0'

然后,您可以执行以下操作来检查是否有任何生物特征可以在设备上使用。

BiometricManager.from(context).canAuthenticate(int) == BiometricManager.BIOMETRIC_SUCCESS

在 Android 6 到 9 上,这仅支持指纹。在 10 及更高版本上,它将支持任何生物特征(例如面部、虹膜)。

于 2019-09-09T18:29:17.697 回答
3

如果您使用的是 compileSdkVersion 29 和 buildToolsVersion "29.0.1"。您可以使用本机检查方法。

我为 Kotlin 编写了这个函数:

 fun checkForBiometrics() : Boolean {
    Log.d(TAG, "checkForBiometrics started")
    var canAuthenticate = true
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (Build.VERSION.SDK_INT < 29) {
            val keyguardManager : KeyguardManager = applicationContext.getSystemService(KEYGUARD_SERVICE) as KeyguardManager
            val packageManager : PackageManager   = applicationContext.packageManager
            if(!packageManager.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)) {
                Log.w(TAG, "checkForBiometrics, Fingerprint Sensor not supported")
                canAuthenticate = false
            }
            if (!keyguardManager.isKeyguardSecure) {
                Log.w(TAG, "checkForBiometrics, Lock screen security not enabled in Settings")
                canAuthenticate = false
            }
        } else {
            val biometricManager : BiometricManager = this.getSystemService(BiometricManager::class.java)
            if(biometricManager.canAuthenticate() != BiometricManager.BIOMETRIC_SUCCESS){
                Log.w(TAG, "checkForBiometrics, biometrics not supported")
                canAuthenticate = false
            }
        }
    }else{
        canAuthenticate = false
    }
    Log.d(TAG, "checkForBiometrics ended, canAuthenticate=$canAuthenticate ")
    return canAuthenticate
}

另外,您必须在您的应用程序 gradle 文件上实现依赖:

implementation 'androidx.biometric:biometric:1.0.0-alpha04'

并使用最新的构建工具:

compileSdkVersion 29
buildToolsVersion "29.0.1"
于 2019-08-21T23:15:11.290 回答
2

FingerPrintManager仅具有有关指纹身份验证的数据,因此具有hasEnrolledFringers(). 但BiometricPrompt用于面部解锁、指纹、虹膜。这就像一个普通的经理班。谷歌已经添加canAuthenticate了来自 Android Q 的支持。但是你可以检查它的较低 API 使用

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
       val hasBiometricFeature :Boolean = context.packageManager.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)

反正谷歌也把它加到了androidx组件中androidx.biometric:biometric

implementation 'androidx.biometric:biometric:1.0.0-alpha04'

使用权限

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

关于“身份验证回调”

public void onAuthenticationError(int errorCode, CharSequence errString) {}

你可以用那些检查错误代码

/**
 * The user does not have any biometrics enrolled.
 */
int BIOMETRIC_ERROR_NO_BIOMETRICS = 11;
于 2019-05-28T08:58:47.823 回答
0

使用BiometricManager它有一个方法

canAuthenticate()

它返回

BIOMETRIC_ERROR_NONE_ENROLLED if the user does not have any enrolled
BIOMETRIC_ERROR_HW_UNAVAILABLE if none are currently supported/enabled
BIOMETRIC_SUCCESS if a biometric can currently be used (enrolled and available)
BIOMETRIC_ERROR_NO_HARDWARE

查看官方文档https://developer.android.com/reference/android/hardware/biometrics/BiometricManager.html

于 2019-05-28T08:28:05.657 回答
0

以下是 Kotlin 中截至今天的生物识别认证的最新实现:

第 1 步:在 build.gradle 中添加以下依赖项

implementation "androidx.biometric:biometric:1.1.0"

第 2 步:在 AndroidManifest.xml 中添加以下权限

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

第 3 步:添加以下方法来检查是否启用了生物识别:

    /**
     * To check if the devices supports biometric authentication
     */
    fun isBioMetricEnabled(ctx: Context) : Boolean    {
        val biometricManager = BiometricManager.from(ctx)
        return biometricManager.canAuthenticate(BiometricManager.Authenticators.BIOMETRIC_WEAK) ==
                BiometricManager.BIOMETRIC_SUCCESS
    }

有关完整的生物特征认证实施,请参阅:

Android BiometricPrompt.Builder.authenticate() 没有显示任何对话框

于 2022-01-13T07:36:16.620 回答
0
 /**
   * Check For Biometrics Support
   * --> Fingerprint don't support in this device
   * --> Fingerprint not enable in this device
  */

    fun checkForBiometricsSupport(context: Context): Boolean {
        val status = BiometricManager.from(context).canAuthenticate(BiometricManager.Authenticators.BIOMETRIC_WEAK)
        return status == BiometricManager.BIOMETRIC_SUCCESS
    }
于 2022-03-01T11:38:07.620 回答