最近项目需要一个指纹验证登录功能,所以就开始查找资料,做一总结。
首先需要加入权限:
<uses-permission android:name="android.permission.USE_FINGERPRINT"/>
这个权限是一个normal级别的,所以不需要再运行时加判断
下来就是我们要判断看你的设备是否支持指纹功能,没有的话那你还玩个啥是不,所以检测是必须的:
- 1.设备是否支持指纹识别
- 由于指纹api是在26之后加入的,所以先判断下这个。
- 2.设备是否处于安全保护中(有指纹识别的手机,在使用指纹识别的时候,还需要强制设置密码或者图案解锁,如果未设置的话是不许使用指纹识别的
- 3.设备是否已经注册过指纹(如果用户未使用过这个指纹技术,那么只能提示用户到系统设置里面去设置)
- 具体代码如下:
-
if (Build.VERSION.SDK_INT < 23) { Toast.makeText(this, "您的系统版本过低,不支持指纹功能", Toast.LENGTH_SHORT).show(); return false; } else { KeyguardManager keyguardManager = getSystemService(KeyguardManager.class); FingerprintManager fingerprintManager = getSystemService(FingerprintManager.class); if (!fingerprintManager.isHardwareDetected()) { Toast.makeText(this, "您的手机不支持指纹功能", Toast.LENGTH_SHORT).show(); return false; } else if (!keyguardManager.isKeyguardSecure()) { PhoneInfoCheck.getInstance(this,"").startFingerprint(); Toast.makeText(this, "您还未设置锁屏,请先设置锁屏并添加一个指纹", Toast.LENGTH_SHORT).show(); return false; } else if (!fingerprintManager.hasEnrolledFingerprints()) { PhoneInfoCheck.getInstance(this,"").startFingerprint(); Toast.makeText(this, "您至少需要在系统设置中添加一个指纹", Toast.LENGTH_SHORT).show(); return false; } } return true;
下面我们来看指纹识别的api
-
//这种使用的是v4的兼容包,推荐使用这种 FingerprintManagerCompat managerCompat = FingerprintManagerCompat.from(this); //这种是使用系统服务,但是必须要在sdk为23以上版本才行 FingerprintManager fingerprintManager = (FingerprintManager)getSystemService(Context.FINGERPRINT_SERVICE);
这里推荐使用第一种,这样才能向下兼容。
-
调用 managerCompat.authenticate方式实现指纹识别,这个方法有5个参数,其中第三个是CancellationSignal,调用cancel 可以取消指纹识别。第四个为AuthenticationCallback,是识别之后的各种回调。
-
Google提供的与指纹识别相关的核心类不多,主类是FingerprintManager,主类依赖三个内部类,如下图所示:
-
FingerprintManager主要提供三个方法如下:
-
FingerprintManager.AuthenticationCallback类提供的回调接口如下,重点区分红色下划线标注的部分
-
启动指纹识别接口
-
启动指纹识别
-
mFingerprintManager.authenticate(cryptoObject, mCancellationSignal, 0, mAuthCallback, null);
参数意思参考文档说明,这里比较复杂的是创建CryptoObject对象,如果只是简单测试可以为null
-
@TargetApi(23) private void initKey() { try { keyStore = KeyStore.getInstance("AndroidKeyStore"); keyStore.load(null); KeyGenerator keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore"); KeyGenParameterSpec.Builder builder = new KeyGenParameterSpec.Builder(DEFAULT_KEY_NAME, KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT).setBlockModes(KeyProperties.BLOCK_MODE_CBC) .setUserAuthenticationRequired(true).setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7); keyGenerator.init(builder.build()); keyGenerator.generateKey(); } catch (Exception e) { throw new RuntimeException(e); } }
基本上大概就这些,之后我我会把我的demo放上去。附上下载链接:https://download.csdn.net/download/qq_22225183/11211920