【问题标题】:How to check if device has fingerprint feature and then use it in Android如何检查设备是否具有指纹功能,然后在 Android 中使用
【发布时间】:2019-09-26 19:45:31
【问题描述】:

我正在使用此权限

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

检查设备是否有指纹。这就是我在 kotlin 中检查它的方式

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

它工作正常,但在Android 8 and above 中它会引发异常。

如何检查指纹并在所有版本中使用它?我知道还有另一种适用于 Android 8 及更高版本的方法,但我很困惑如何实现它以使其适用于每台设备

【问题讨论】:

    标签: android kotlin android-fingerprint-api


    【解决方案1】:

    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 在开始身份验证时显示系统提供的对话框。在一个 设备可能具有不同类型的生物特征的世界 身份验证,有系统提供的更现实 身份验证对话框,因为方法可能因供应商/设备而异。

    我建议您阅读此主题:

    How to add fingerprint authentication to your Android app

    另外,请关注其他线程:

    How to check device compatibility for finger print authentication in 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" />
    

    希望对你有帮助。

    【讨论】:

    • 它表明 FingerprintManagerisHardwareDetected()hasEnrolledFingerprints() 在 Java 中已被弃用
    【解决方案2】:

    新的 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

    【讨论】:

    • 谢谢,这对我有用,但 canAuthenticate() 已被弃用,我使用 canAuthenticate(BiometricManager.Authenticators.BIOMETRIC_WEAK)BIOMETRIC_STRONG
    【解决方案3】:

    您可以使用 Androidx 中的 biometric lib。它仍处于 alpha 阶段,但到目前为止运行良好。好处是您不需要针对特定​​ Android API 级别的两个实现。

    fun isAvailable(context: Context): Boolean {
        val fingerprintManager = FingerprintManagerCompat.from(context)
        return fingerprintManager.isHardwareDetected && fingerprintManager.hasEnrolledFingerprints()
    }
    

    【讨论】:

      猜你喜欢
      • 2016-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-05
      • 2021-12-26
      • 2017-12-02
      相关资源
      最近更新 更多