Android硬件开发系列一指纹识别

来源:互联网 发布:古墓丽影7for mac 编辑:程序博客网 时间:2024/06/06 04:08

Android6.0系统才开始支持指纹识别,不过也有些手机定制rom过早就提供相关api来支持,这里不展开,主要从如下几个方面介绍。

  • 兼容性介绍

    1、Api兼容性
    既然是高版本才有的Api,那必须要兼容低版本使用了, Android.support.v4包中提供了兼容Api:FingerprintManagerCompat,其实现很简单就是做了下api版本判断,对于低版本的系统提供了空实现,如下:

static final FingerprintManagerCompatImpl IMPL;      static {        final int version = Build.VERSION.SDK_INT;        if (version >= 23) {            IMPL = new Api23FingerprintManagerCompatImpl();        } else {            IMPL = new LegacyFingerprintManagerCompatImpl();        }    }    在LegacyFingerprintManagerCompatImpl中全部是空实现:     private static class LegacyFingerprintManagerCompatImpl            implements FingerprintManagerCompatImpl {        public LegacyFingerprintManagerCompatImpl() {        }        @Override        public boolean hasEnrolledFingerprints(Context context) {            return false;        }        @Override        public boolean isHardwareDetected(Context context) {            return false;        }        @Override        public void authenticate(Context context, CryptoObject crypto, int flags,                CancellationSignal cancel, AuthenticationCallback callback, Handler handler) {            // TODO: Figure out behavior when there is no fingerprint hardware available        }    }

对于强迫症而言,要求控制项目大小的话,不希望因为这个API就要导入V4,个人直接抽离了这个V4中的兼容实现,直接一个类解决问题。

2、真机适配现状
真机测试在多个品牌手机上发现都运行良好,没有出现特别机型不适配,运行情况不统一现象,说明各个厂商良心发现啊,没有给我带来太多的适配问题,这也是硬件开发中最头疼的事情。

  • Api使用细节

    1、检查工作
    对于硬件设备使用来说,检查工作少不了啊,直接贴代码:

 FingerprintManagerCompat fingerprintManager = FingerprintManagerCompat.from(this);        //首先检查硬件设备-指纹识别是否支持        if (!fingerprintManager.isHardwareDetected()) {            Snackbar.make(getWindow().getDecorView(), "设备不支持指纹识别", Snackbar.LENGTH_LONG).show();            return;        }        //安全性检查,只要少一样都用不起来,认为必须要求有屏幕锁        KeyguardManager keyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);        if (!keyguardManager.isKeyguardSecure()) {            Snackbar.make(getWindow().getDecorView(), "设备没有屏幕锁", Snackbar.LENGTH_LONG).show();            return;        }        //是否设置了指纹        if (!fingerprintManager.hasEnrolledFingerprints()) {            Snackbar.make(getWindow().getDecorView(), "你还没有设置指纹", Snackbar.LENGTH_LONG).show();            return;        }

当然还要检查的一项就是权限检查,如何申请权限不展开了哈。

android.permission.USE_FINGERPRINT

2、开始进行指纹识别

public static void startFingerPrintConfirm(Context context, CancellationSignal cancellationSignal,  AuthenticationCallBackCompact operator) throws Exception {        FingerprintManagerCompat fingerprintManagerCompat = FingerprintManagerCompat.from(context);        CryptoObjectHelper cryptoObjectHelper = new CryptoObjectHelper();//有利于识别cancellationSignal        fingerprintManagerCompat.authenticate(cryptoObjectHelper.buildCryptoObject(), 0, cancellationSignal, operator, null);    }    //最终调用接口    authenticate(@Nullable CryptoObject crypto, @Nullable CancellationSignal cancel,            int flags, @NonNull AuthenticationCallback callback, @Nullable Handler handler)     其中AuthenticationCallback 不可为null,指纹识别开启之后,可以联系识别5次,若5次都Fail,则回调Error 

3、注意事项,踏过的坑

1)其中CryptoObject crypto是可以为null,但是这个建议最好要实现一个加密的对象,有利于在使用到CancellationSignal 对象时候,用来取消当前已开启识别的进程。例如个人项目中就出现在一次已经开启了指纹识别中,用户需要关闭这个识别功能,但是为了安全只能是用户本人指纹验证过后来关闭这个功能,故此时又要开启另一个页面来验证指纹,这时候若没有加密的对象话,会导致第二次开启不了,因为crypto是和每次call关联,同时开启第二次手机会自动把第一次的关闭,执行第一次的cancel.cancel()方法,导致第二次无故躺枪被认为了已经取消了,启动不了。2)针对如上1)场景即使生成了crypto,还会有一个新问题(此时心里1万个草泥马奔腾),由于手机会自动把第一次的关闭,取消上次操作,倒好直接回调第一次的取消的监听,告诉你被取消了。但是还回调一次AuthenticationCallback.onAuthenticationError()并且是在第二次调用中的新对象的回调里面,按道理如果这里不共用回调对象AuthenticationCallback,也是在第一个对象中回调啊。这个失败回调导致流程打乱了,其实这时候已经重新开启了,这不是把流程干扰了吗,纠结好久,用多种方式来判断,这个时候的回调不处理,总觉得不够完美,后想到了一个办法,在开启第二次时候,先把第一次的启动主动cancel掉,然后再启动第二次,当时觉得这个办法好,可是还是一样的情况,后来发现必须要间隔一段时间。3)在上文中提到了需要设置锁屏,锁屏之后,可以通过指纹解锁啊,这个时候,如果应用中已经在等待用户输入指纹,再锁屏并解锁,发现返回应用之后,已经被取消了,原因同理,都是不能同时开启两次,会把上次的取消掉。
1 0
原创粉丝点击