Android6.0 Fingerprint Features(指纹识别)

关于指纹识别需要了解的:

  • 要开启指纹识别,必须开启密码锁屏(Pin,Password,Pattern等),如果锁屏密码被清除,或者设置为滑动,之前录入的指纹会被删除。

  • 识别错误回调onAuthenticationFailed,错误六次之后,回调onAuthenticationError,onAuthenticationError被回调后,后续不会再有任何回调(直到取消本次指纹输入,重新调用authenticate后才可以)

  • onAuthenticationError发生后,即使退出后重新调用authenticate方法,仍然马上就会回调onAuthenticationError方法,而不是等待输入指纹,只有间隔一定时间之后,重新调用authenticate,才能开启指纹传感器等待输入指纹


简介

最新的Android6.0系统中的指纹识别功能是一大亮点,开发者可以考虑用这个功能来简化一些鉴权方面的UI交互(避免频繁输入password,也避免用户记太多的password)。新的SDK中指纹识别api被分为两类,一类为Fingerprint API,另一类为Confirm Credential, 本文分别介绍这两类api各自特点相互的区别,以及使用方法。


Fingerprint API & Confirm Credential 区别

  • Fingerprint API一个纯指纹相关的API,就是为了提供指纹鉴别的功能,调用authenticate (callback)后指纹传感器开始等待指纹录入,用户录入指纹后通过callback回调识别是否成功(实际的authenticate方法还有一些其他的参数),这个API没有任何系统UI,所以开发者可以设计指纹识别流程的UI,只要确保正确的调用authenticate(callback)方法,正确的处理其中的callback即可。

  • Confirm Credential 核心是提供了一个系统的解锁界面Activity,使用的时候首先用mKeyguardManager.createConfirmDeviceCredentialIntent(null, null);方法获取到一个Intent,然后 startActivityForResult(intent, REQUEST_CODE_CONFIRM_DEVICE_CREDENTIALS)的方式拉起Activity,解锁是否成功则在onActivityResult回调中体现。这个系统的解锁界面类似锁屏界面,可以用锁屏密码或者指纹解锁。
    注意:此处的解锁界面具体解锁方式和手机锁屏设置一致,例如锁屏设置的是图案解锁那么这里就是图案解锁,锁屏设置的是密码或者PIN码解锁,那么这里也是密码或者PIN码解锁。


Fingerprint API的使用:

**首先记得在manifest中添加 android:name="android.permission.USE_FINGERPRINT" />权限**
使用前先判断是否硬件支持,是否有指纹等:

if (!mFingerprintManager.isHardwareDetected()) {
               // 判断硬件是否支持
                Toast.makeText(this,
                        "Fingerprint hardward unavailable",
                        Toast.LENGTH_LONG).show();
                return;
            }
if (!mKeyguardManager.isKeyguardSecure()) {
            // 判断用户是已经开启锁屏密码
            Toast.makeText(this,
                    "Secure lock screen hasn't set up.\n"
                            + "Go to 'Settings -> Security -> Screenlock' to set up a lock screen",
                    Toast.LENGTH_LONG).show();
            return;
        }
if (!mFingerprintManager.hasEnrolledFingerprints()) {
                // 判断是否有已经录入的指纹
                Toast.makeText(this,
                        "Go to 'Settings -> Security -> Fingerprint' and register at least one fingerprint",
                        Toast.LENGTH_LONG).show();
                return;
            }

使用startListening()打开指纹传感器:

boolean mSelfCancelled = false;
    public boolean isFingerprintAuthAvailable() {
        return mFingerprintManager.isHardwareDetected()
                && mFingerprintManager.hasEnrolledFingerprints();
    }

    public void startListening(FingerprintManager.CryptoObject cryptoObject) {
        if (!isFingerprintAuthAvailable()) {
            return;
        }
        mSelfCancelled = false;
        CancellationSignal mCancellationSignal = new CancellationSignal();
        mFingerprintManager
                .authenticate(null, mCancellationSignal, 0, callback , null);
    }

    public void stopListening() {
        if (mCancellationSignal != null) {
            mSelfCancelled = true;
            mCancellationSignal.cancel();
            mCancellationSignal = null;
        }
    }

使用callback定义回调:(callback为上面authenticate()方法中的一个参数)

FingerprintManager.AuthenticationCallback callback = new FingerprintManager.AuthenticationCallback() {
        @Override
        public void onAuthenticationError(int errMsgId, CharSequence errString) {
            if (!mSelfCancelled) {
                showError(errString);
            }
        }

        @Override
        public void onAuthenticationHelp(int helpMsgId, CharSequence helpString) {
            showError(helpString);
        }

        @Override
        public void onAuthenticationFailed() {
            showError(getActivity().getResources().getString(
                    R.string.fingerprint_not_recognized));
        }

        @Override
        public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) {
            showSuccess();
        }

Confirm Credential 的使用

由于认证页面为系统的一个Activity所以,app本身 不需要 申明指纹权限 android:name="android.permission.USE_FINGERPRINT" />
使用前先判断是否已经开启锁屏密码:(如果没有开启,后面的createConfirmDeviceCredentialIntent()方法会反回一个null 的intent)

if (!mKeyguardManager.isKeyguardSecure()) {
            // 判断用户是已经开启锁屏密码
            Toast.makeText(this,
                    "Secure lock screen hasn't set up.\n"
                            + "Go to 'Settings -> Security -> Screenlock' to set up a lock screen",
                    Toast.LENGTH_LONG).show();
            return;
        }

在Activity中唤起系统认证页面:

    private void showAuthenticationScreen() {
        // createConfirmDeviceCredentialIntent(title,description)中可以自定义解锁页面的title和description:
        Intent intent = mKeyguardManager.createConfirmDeviceCredentialIntent(null, null);
        if (intent != null) {
            startActivityForResult(intent, REQUEST_CODE_CONFIRM_DEVICE_CREDENTIALS);
        }
    }

在onActivityResult()中处理回调:

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == REQUEST_CODE_CONFIRM_DEVICE_CREDENTIALS) {
            // Challenge completed, proceed with using cipher
            if (resultCode == RESULT_OK) {
                showSuccess();
            } else {
                showError();
            }
        }
    }

Android6.0 Fingerprint Features(指纹识别)_第1张图片

你可能感兴趣的:(Android)