如何通过生物特征api检查用户的生物特征首选项?

时间:2019-04-09 08:26:04

标签: android samsung-mobile android-9.0-pie android-fingerprint-api android-biometric-prompt

我们都知道,从android 9.0开始,android引入了 BiometricPrompt Api ,以便为不断增长的生物识别传感器(例如指纹,面部ID等)提供标准的身份验证体验。

现在,有了这个新的BiometricPrompt Api用户,就可以通过指纹,面部扫描仪或虹膜扫描来验证身份(取决于他们的生物特征偏好)。 BiometricPrompt api将处理此问题,并将通过各种回调通知我们。

下面是我的代码,用于显示生物识别提示。

 biometricPrompt = new BiometricPrompt.Builder(context)
            .setTitle("FingerPrint Authentication")
            .setSubtitle("Login via Fingerprint")
            .setDescription("Touch Fingerprint Sensor")
            .setNegativeButton("Cancel", context.getMainExecutor(),
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            Log.d(TAG,"Cancelled");
                        }
                    })
            .build();

现在,如果您看到我的代码,则将标题设置为指纹认证。现在在设备设置中,如果用户将生物特征偏好设置设置为人脸ID 而不是 FingerPrint ,则此 biometicPrompt 将通过faceID和指纹对用户进行身份验证即使用户持续触摸传感器,传感器也无法工作。由于生物识别标题说“指纹认证”,而用户实际上是通过 faceID

进行认证的,因此这会造成混乱

我们是否可以通过任何方式了解用户选择了哪些生物特征偏好设置(例如,指纹或FaceID)?因此,根据该首选项,我可以在BiometricPrompt上显示适当的消息,以免用户感到困惑。

我已经浏览过BiometricPrompt的所有api,但可以找到与BiometricPrefecene相关的任何信息。

任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:0)

目前尚不知道此类信息,去年已经开了一个问题来询问(https://issuetracker.google.com/issues/111315641)。由于Android试图简化开发人员在其应用中实现身份验证的路径,因此BiometricPrompt实现中缺少选项(请参见Android文档中的BiometricPrompt实现)。

答案 1 :(得分:0)

在您的情况下,您只需将标题字符串更改为“生物特征认证”,其他字符串也可以更改。有关示例,请参见下面指向的博客文章。

您的代码可能如下所示。但我也建议您使用strings.xml资源文件,而不要在代码中硬编码字符串。例如,将来可能需要翻译服务。

biometricPrompt = new BiometricPrompt.Builder(context)
        .setTitle("Biometric Authentication")
        .setSubtitle("Login via biometrics")
        .setDescription("Use the Biometrics Sensor")
        .setNegativeButton("Cancel", context.getMainExecutor(),
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        Log.d(TAG,"Cancelled");
                    }
                })
        .build();

更广泛地讲,必须在API团队决定开发人员是否应该了解用户的生物特征偏好之前评估隐私隐含性。尚不清楚开发人员为何需要此信息。已发布了两篇博客文章,涉及生物识别以及如何实施它们(blog oneblog two)。除了这种区别(即强者与弱者)之外,用户偏爱或最终使用的外形似乎并不相关。

答案 2 :(得分:0)

虽然不是完美的解决方案,但是您可以使用PackageManager API来确定设备是否具有身份验证器硬件,例如:

if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_FACE))
{
}

我创建了一个如下的帮助器类:

class BiometricAuthenticator
{
 public enum BiometricType
 {
  FINGERPRINT,
  FACE, 
  IRIS,
  NONE
 }

 public static boolean hasBiometricAuthenticator(Context context)
 {
    int biometry = BiometricManager.BIOMETRIC_ERROR_UNSUPPORTED;
    if (VERSION.SDK_INT >= 30)
        biometry = BiometricManager.from(context).canAuthenticate(Authenticators.BIOMETRIC_STRONG | Authenticators.BIOMETRIC_WEAK);
    else
        biometry = BiometricManager.from(context).canAuthenticate();

    switch (biometry)
    {
        case BiometricManager.BIOMETRIC_ERROR_HW_UNAVAILABLE:
        case BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED:
        case BiometricManager.BIOMETRIC_ERROR_NO_HARDWARE:
             return (false);
        case BiometricManager.BIOMETRIC_SUCCESS:
             return true;
    }
    return (false);
 }

 /**
  * biometricType()
  *
  * returns type of biometry supported
  */
 public static BiometricType biometricType(Context context)
 {
    if (VERSION.SDK_INT < 23)
        return BiometricType.NONE;

    PackageManager packageManager = context.getPackageManager();

    // SDK 29 adds FACE and IRIS authentication
    if (VERSION.SDK_INT >= 29)
    {
        if (packageManager.hasSystemFeature(PackageManager.FEATURE_FACE))
            return BiometricType.FACE;
        if (packageManager.hasSystemFeature(PackageManager.FEATURE_IRIS))
            return BiometricType.IRIS;
        if (packageManager.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT))
            return BiometricType.FINGERPRINT;
        return BiometricType.NONE;
    }

    // SDK 23-28 offer FINGERPRINT only
    return (packageManager.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT) ? BiometricType.FINGERPRINT : BiometricType.NONE);
 }
}

这使您可以确定是否存在生物特征认证者(hasBiometricAuthenticator),如果存在,则将认证者的类型作为BiometricType枚举返回。

从理论上讲,一个设备可以具有多个身份验证器,biometricType()将在API30 +设备上按优先顺序返回FACE,IRIS,然后返回FINGERPRINT。

希望Google将来会提供更好的API,但是这些技巧至少将有助于在对话框上获得适当的提示

答案 3 :(得分:-1)

In Android R was added a method called setAllowedAuthenticators

public BiometricPrompt.Builder setAllowedAuthenticators (int authenticators)

可选:指定可由BiometricPrompt调用以认证用户的认证器类型。可用的身份验证器类型在身份验证器中定义,可以通过按位或进行组合。默认值为:

  • Authenticators#BIOMETRIC_WEAK用于非加密身份验证,或者
  • Authenticators#BIOMETRIC_STRONG用于基于密码的身份验证。

如果使用此方法,并且在调用BiometricPrompt#authenticate(...)时没有任何指定类型的身份验证器可用,则身份验证将被取消,并且AuthenticationCallback#onAuthenticationError(int,CharSequence)将被调用适当的错误代码。


setDeviceCredentialAllowed(boolean)相比,此方法应更为可取,如果同时使用两者,则应覆盖后者。使用此方法(通过Authenticators#DEVICE_CREDENTIAL)启用设备凭据身份验证将替换提示上的否定按钮,使同时调用setNegativeButton(java.lang.CharSequence,java.util.concurrent.Executor,android.content。 DialogInterface.OnClickListener)。


身份验证者

一个位字段,表示可能是 由提示调用。值为0或以下各项的组合 BiometricManager.Authenticators.BIOMETRIC_STRONG, BiometricManager.Authenticators.BIOMETRIC_WEAK和 BiometricManager.Authenticators.DEVICE_CREDENTIAL