安卓开发:如何通过Fingerprint API获取已验证的指纹名称
获取验证通过的指纹名称解决方案
嘿,我明白你现在的困扰——想在指纹验证成功后拿到对应的指纹名称对吧?首先得给你说个关键信息:Android出于隐私保护的考虑,并没有在指纹验证成功的回调里直接返回当前通过验证的具体指纹信息。不过我们可以通过提前获取设备上所有已注册的指纹列表,来实现相关需求,比如展示所有已注册的指纹名称,或者在验证成功后提示用户使用了已注册的指纹登录。
下面分Android版本给你具体的解决方案,结合你的代码来修改:
针对 Android 8.0(API 26)及以上版本
从API 26开始,旧的FingerprintManager提供了getEnrolledFingerprints()方法,能拿到设备上所有已注册的Fingerprint对象列表,每个对象可以通过getName()方法获取用户设置的指纹名称(比如“左手食指”这类自定义名称)。
修改你的FingerprintHandler代码
你可以在类里加一个获取已注册指纹的方法,然后在验证成功的回调里使用这些信息:
// 先导入必要的类 import android.hardware.fingerprint.Fingerprint; import android.os.Build; import android.util.Log; import java.util.List; public class FingerprintHandler extends FingerprintManager.AuthenticationCallback { private CancellationSignal cancellationSignal; private Context appContext; public FingerprintHandler(Context context) { appContext = context; } // 添加获取已注册指纹列表的方法 private List<Fingerprint> getEnrolledFingerprints() { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { return null; // API 26以下不支持这个方法 } FingerprintManager fingerprintManager = (FingerprintManager) appContext.getSystemService(Context.FINGERPRINT_SERVICE); if (ActivityCompat.checkSelfPermission(appContext, Manifest.permission.USE_FINGERPRINT) != PackageManager.PERMISSION_GRANTED) { return null; } return fingerprintManager.getEnrolledFingerprints(); } public void startAuth(FingerprintManager manager, FingerprintManager.CryptoObject cryptoObject) { cancellationSignal = new CancellationSignal(); if (ActivityCompat.checkSelfPermission(appContext, Manifest.permission.USE_FINGERPRINT) != PackageManager.PERMISSION_GRANTED) { return; } manager.authenticate(cryptoObject, cancellationSignal, 0, this, null); } @Override public void onAuthenticationError(int errMsgId, CharSequence errString) { scannerDialog(errString.toString()); } public void scannerDialog(String message) { Toast.makeText(appContext, message, Toast.LENGTH_LONG).show(); } @Override public void onAuthenticationHelp(int helpMsgId, CharSequence helpString) { scannerDialog("" + helpString); } @Override public void onAuthenticationFailed() { scannerDialog("Access denied"); } @Override public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) { Log.e("LoginSuccess","Success"); // 这里处理指纹名称的逻辑 List<Fingerprint> enrolledFingerprints = getEnrolledFingerprints(); if (enrolledFingerprints != null && !enrolledFingerprints.isEmpty()) { // 遍历所有已注册的指纹名称 for (Fingerprint fp : enrolledFingerprints) { Log.d("FingerprintInfo", "已注册指纹名称:" + fp.getName()); } // 如果想给用户提示,可以这样(注意:无法确定具体是哪个指纹通过验证) scannerDialog("登录成功!使用的是已注册的指纹:" + enrolledFingerprints.get(0).getName()); } else { scannerDialog("登录成功,但未获取到指纹名称"); } } }
针对 Android 9.0(API 28)及以上版本:推荐使用BiometricPrompt
从API 28开始,Google推荐用BiometricPrompt替代旧的FingerprintManager,它提供了更统一的生物识别验证接口,同时也兼容指纹、面部识别等多种生物识别方式,获取已注册指纹名称的逻辑和上面类似。
简单示例代码
// 初始化BiometricPrompt BiometricPrompt biometricPrompt = new BiometricPrompt.Builder(appContext) .setTitle("指纹登录") .setSubtitle("请验证你的指纹") .setNegativeButton("取消", appContext.getMainExecutor(), (dialog, which) -> { // 取消按钮的逻辑 }) .build(); // 验证回调 BiometricPrompt.AuthenticationCallback authCallback = new BiometricPrompt.AuthenticationCallback() { @Override public void onAuthenticationSucceeded(BiometricPrompt.AuthenticationResult result) { super.onAuthenticationSucceeded(result); Log.e("LoginSuccess", "Success"); // 获取已注册指纹名称(API 26+) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { FingerprintManager fpManager = (FingerprintManager) appContext.getSystemService(Context.FINGERPRINT_SERVICE); if (ActivityCompat.checkSelfPermission(appContext, Manifest.permission.USE_FINGERPRINT) == PackageManager.PERMISSION_GRANTED) { List<Fingerprint> fps = fpManager.getEnrolledFingerprints(); if (fps != null && !fps.isEmpty()) { Log.d("FingerprintNames", "所有已注册指纹:" + fps.stream().map(Fingerprint::getName).collect(Collectors.toList())); } } } } }; // 开始验证 biometricPrompt.authenticate(new CancellationSignal(), appContext.getMainExecutor(), authCallback);
重要注意事项
- 隐私限制:Android系统不会在验证成功时告诉你具体是哪一个指纹通过了验证,这是出于用户隐私保护的设计,我们只能获取设备上所有已注册的指纹名称列表。
- 权限配置:别忘了在
AndroidManifest.xml里添加必要的权限:
<!-- 旧版指纹权限(API 23-27) --> <uses-permission android:name="android.permission.USE_FINGERPRINT" /> <!-- 新版生物识别权限(API 28+) --> <uses-permission android:name="android.permission.USE_BIOMETRIC" />
内容的提问来源于stack exchange,提问作者Meowok
相关产品推荐
相关产品推荐

