【问题标题】:Face Authentication using androidx Biometric API in Android在 Android 中使用 androidx Biometric API 进行人脸身份验证
【发布时间】:2020-08-28 07:38:40
【问题描述】:

我需要使用指纹和人脸身份验证集成生物特征身份验证。指纹身份验证工作完美,但是当我只设置人脸身份验证时,我得到来自 BiometricManager.from(context) 方法的生物识别未注册响应,如下所示,

val biometricManager = BiometricManager.from(context)
    when(biometricManager.canAuthenticate()){
        BiometricManager.BIOMETRIC_SUCCESS ->{
            Log.e(TAG, "App can authenticate using biometrics.")
        }
        BiometricManager.BIOMETRIC_ERROR_NO_HARDWARE ->{
            Log.d(TAG, "Hardware not available")
        }
        BiometricManager.BIOMETRIC_ERROR_HW_UNAVAILABLE ->{
            Log.d(TAG, "Biometric features are currently unavailable.")
        }
        BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED ->{
            Log.d(TAG, "The user hasn't associated any biometric credentials with their account.")
        }
        else ->{
            Log.d(TAG, "Nothing supported")
        }
    }

【问题讨论】:

  • 您在哪个设备和 Android 版本上进行测试?您使用的是 AndroidX 生物识别库,还是 Android 内置的功能?
  • 我正在使用 'androidx.biometric:biometric:1.0.1' 在具有 Android 10 操作系统的一加 6t 上实现和测试
  • 这个问题也出现在我用于测试的 Galaxy S8 上,因此这可能与制造商无关。
  • 也在 LG G6 上进行了测试,得到了相同的结果。不确定它是否取决于制造商。
  • 设备上的人脸注册了吗?

标签: android kotlin android-biometric-prompt android-biometric


【解决方案1】:

Android 生物识别 API 仅适用于生物识别功能(面部、指纹、虹膜)与 Android 生物识别堆栈兼容的设备。我有一组支持人脸功能的设备,其中只有少数支持 Android Biometrics。

【讨论】:

    【解决方案2】:

    在查看了为 Android 实现生物识别的所有障碍之后,我选择不使用 BiometricManager.from(context) 方法来检查是否启用了生物识别身份验证,而不是检查是否启用了 KEYGUARD_SERVICE 并使用以下提示信息

    BiometricPrompt.PromptInfo.Builder().apply {
                setTitle(getString(R.string.title))
                setSubtitle(getString(R.string.sub_title))
                setConfirmationRequired(true)
                setDeviceCredentialAllowed(true)
            }.build()
    

    即使只设置了人脸 ID 并且不支持当前回调,应用程序也会回退到设备 PIN 身份验证方法。

    【讨论】:

    • 当设备中没有注册生物特征(面部和指纹)时,这项工作是否有效?
    • 是的,需要添加验证keyguardManager.isKeyguardSecure
    • 当您调用 authenticate() 并且没有在设备中注册生物识别并且启用了 KEYGUARD_SERVICE 时,系统提示中会显示什么。你在哪个设备上测试过这个?我建议你在多个设备上测试
    • 是的,如果设备中没有注册生物识别但 KEYGUARD_SERVICE 已启用,则应用会要求 PIN/图案锁定进行身份验证。我已经在没有生物识别硬件的一加 6、LG、三星 J7 和红米设备上进行了相同的测试。
    • @VijayPatole 你能分享你的代码吗?我在某个时候被卡住了。
    【解决方案3】:

    当我将它集成到我的应用程序时,我遇到了同样的问题

    biometricManager.canAuthenticate(BIOMETRIC_STRONG)
    

    要检查设备中是否有生物识别功能,它会返回 BIOMETRIC_ERROR_NONE_ENROLLED 并且一旦我将身份验证模式更改为BIOMETRIC_WEEK它工作得很好,我在三星 S9 和其他一些设备上进行了测试。 目前正在使用这种生物识别依赖,希望它对你有用

    implementation "androidx.biometric:biometric-ktx:1.2.0-alpha03"
    

    【讨论】:

    • 我更改为 BIOMETRIC_WEAK ,但在多个设备上仍然存在同样的问题
    【解决方案4】:

    我在使用它时发现的一些事实。这是基于 Biometric API “implementation 'androidx.biometric:biometric:1.0.1'”。

    1. 三星设备不支持人脸识别,因为它没有 3D 人脸解锁refer here。这个问题在三星方面是公开的,因为三星的面部解锁是由三星自己开发的,而不是来自谷歌操作系统。但它确实支持使用生物识别管理器 API 进行指纹扫描。
    2. 真人脸解锁仅适用于 Pixel 4(这是基于我的测试,不确定其他设备是否支持,但我测试过的顶级设备是三星,包括 Note 系列和 Galaxy 系列,以及摩托罗拉系列)我只能在 Pixel 4 中使用人脸解锁。
    3. 三星正在努力,很快就会上市(不确定何时)。
    4. 到目前为止,很少有应用程序支持面部解锁,因为大多数 Android 基础设备都不是来自 google,而且基于 3d 的解锁在制造方面不可用。

    我为社区创建了参考 POC 以提供帮助。该文档没有提供有关生物特征变化检测的良好文档。这是纯 kotlin 代码,还可以检测生物特征变化和许多功能,例如用户是否注册了 Bio,设备是否注册了 Bio,什么类型的生物特征,用户之前注册的。请看看这个link

    【讨论】:

    • 希望您没有在三星 S10 设备上进行验证,三星 S10 与 Android 生物识别堆栈兼容。声明“IRIS 不通过生物识别处理”是错误的。如果设备具有与 Android 生物识别堆栈兼容的 IRIS 功能,那么它就可以工作。在我的设备仓库中,我有三星 S10、MI 和 Pixel 4 设备,它们与 Android Biometrics 兼容。
    • 请通过Android Biometric CDD doc source.android.com/compatibility/…
    • 请阅读我的回答我提到了人脸识别。所有设备都兼容生物识别。如果你仔细工作,S10 有三个不同的版本。我用过s10e但还不支持,原因是三星自己没有发布补丁,它在等待名单上。我已经编辑了与 IRIS 相关的答案,并且 IRIS 不是纯生物识别。
    • 您能解释一下为什么 IRIS 不是纯生物识别吗?我指的是您的说法“三星设备不支持人脸识别,因为它没有 3D 人脸解锁功能。”我也想了解,“人脸认证对3D人脸解锁”的依赖是什么
    • 人脸、虹膜和指纹是生物识别的一部分。您可以参考source.android.com/compatibility/…。问题是关于使用 Android Biometrics 进行面部身份验证的。设备指纹传感器可能与 Android Biometrics 兼容,但这并不意味着它的面部传感器也将支持 Andrid Biometrics。
    猜你喜欢
    • 2020-04-30
    • 2018-11-16
    • 1970-01-01
    • 1970-01-01
    • 2016-08-30
    • 1970-01-01
    • 2022-11-10
    • 2017-03-11
    • 1970-01-01
    相关资源
    最近更新 更多