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
- Android硬件开发系列一指纹识别
- android指纹识别开发
- Android 开发指纹识别
- Android开发 之 指纹识别
- android开发-指纹识别
- 电容式 指纹识别 android 智能硬件
- Android 指纹识别App开发demo
- Android 6.0指纹识别App开发demo
- Android 6.0指纹识别App开发demo
- Android 6.0指纹识别App开发demo
- Android 6.0指纹识别App开发demo
- Android 6.0指纹识别App开发Demo
- Android开发学习之路-指纹识别api
- Android指纹识别
- Android 指纹识别
- Android指纹识别
- Android 指纹识别
- Android指纹识别
- mount 整个flash内容
- 今天正式进军java
- Android Git 常用命令和规范
- 关闭浏览器当前页面
- Spark从外部读取数据之textFile
- Android硬件开发系列一指纹识别
- Ubuntu 16.04+CUDA8.0+MKL+Opencv3.2+Matlab R2016b+Caffe安装
- Robot Framework自动化测试-AutoItLibrary库-上传文件
- Fiddler 手机抓包
- Failed to resolve: junit:junit:4.12的解决办法
- Tkinter小结 界面+快捷键设置
- secureCRT使用
- 浅谈数据库索引
- Buffer cache(缓冲区缓存)