29

我正在编写一个应用程序功能来使用生物指纹身份验证 API 对用户进行身份验证。它与BiometricPrompt API 的组合按预期工作。

一般来说,它会显示自己的 UI 对话框,因此可以在 Android 设备上统一。(指纹管理器API 的改进)

在一种设备测试场景中,我遇到了显示屏内(在屏幕上,例如 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.")
        }
    }
}

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

在此处输入图像描述

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

在此处输入图像描述

4

2 回答 2

1

前段时间面临同样的问题 - OnePlus 6T 没有生物识别用户界面,同时三星 A51 - 有自己的(自定义)指纹 API 用户界面和另一个用于 BiometricPrompt API 的用户界面。我试图观察 Activity 窗口焦点丢失(对于 OnePlus - 活动不丢失焦点,同时 BiometricPrompt UI 导致焦点丢失),但三星设备出现问题。

我找到的唯一解决方案,它现在有效:

  1. 需要获取正确的设备名称(以一加为例,它不应该是一加A6003,而是一加 6
  2. 需要执行请求https://m.gsmarena.com/res.php3?sSearch=Device+Name,你应该得到匹配的列表,通常需要第一个
  3. 解析 HTML(来自预览步骤)以获取设备规范的链接(如https://m.gsmarena.com/oneplus_6t-9350.php
  4. 现在您需要对该链接执行请求并再次解析 HTML 并获取“传感器”部分。你应该得到一个字符串,如“指纹(显示屏下,光学),加速度计,陀螺仪,接近度,指南针
  5. 拆分此字符串以获取带有传感器的列表
  6. 现在,当您需要检查设备上是否存在显示屏扫描仪时,只需检查同一传感器的“指纹”和“显示屏下”。

与 impl链接。可以作为一个例子

于 2021-10-28T11:01:35.907 回答
-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" />
于 2021-07-14T11:49:15.760 回答