大家都知道,从Android9.0开始,安卓引入了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();现在,如果您看到我的代码,我将标题设置为指纹身份验证。现在在设备设置中,如果用户将生物识别首选项设置为Face 而不是 fingerprint ,则此将通过faceID对用户进行身份验证,即使用户一直触摸传感器,指纹传感器也无法工作。这将造成混淆,因为生物识别标题是说“指纹认证”和用户实际上是通过faceID认证的。
有什么方法可以让我们知道用户选择了什么生物识别偏好(例如指纹或FaceID)?因此,基于这种偏好,我可以在BiometricPrompt上显示适当的消息,这样用户就不会感到困惑。
我已经从BiometricPrompt中探索了所有api,但是可以找到任何与BiometricPreference相关的内容。
任何帮助都将不胜感激。
发布于 2019-06-18 11:52:30
目前还不可能知道这类信息,去年已经有一个问题开始要求它(https://issuetracker.google.com/issues/111315641)。由于Android试图简化开发人员在其应用程序中实现身份验证的路径,BiometricPrompt实现中缺少选项(参见BiometricPrompt实现的Android )。
发布于 2020-11-24 17:25:20
虽然不是一个完美的解决方案,但您可以使用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,然后按偏好顺序进行指纹识别。
希望Google将来能公开更好的API,但这些技巧至少有助于在对话框中获得适当的提示。
发布于 2020-01-13 17:35:43
在您的情况下,您可以简单地将标题字符串更改为“生物识别身份验证”,以及其他字符串。关于一个例子,请看下面的博客文章。
您的代码可能如下所示。但我还建议您使用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团队决定开发人员是否应该知道用户的生物特征偏好之前,必须评估其对隐私的影响。现在还不清楚为什么开发人员需要这些信息。已经发表了两篇关于强和弱生物特征以及如何实现它们的博客文章(博客一,博客二)。除了这种区别(即强与弱)之外,用户喜欢或最终使用什么形式因素似乎不相关。
https://stackoverflow.com/questions/55588234
复制相似问题