开始

根据杭州蚁创科技有限公司《FPW(M)指纹系列产品开发手册》编写, 仅适用对应硬件,留作备忘。

在android6.0之后谷歌对指纹识别进行了官方支持,目前指纹领域无论从产品角度还是技术角度都已经趋于成熟,开发过程中遇到很多的问题,在此先按下不表。如果在没有指纹模块的安卓系统上进行指纹开发,就需要相应硬件的支持。于是采用了杭州蚁创科技有限公司的硬件。本篇博文内容也仅适应对应硬件。在这里抛砖引玉,希望能让大家开发时少走弯路。

使用

1. 添加权限:

指纹开发,硬件需要通过usb连接到安卓设备上。在此也需要将usb接口设置成host模式,不然的话无法进行识别。

<uses-feature android:name="android.hardware.usb.host"  android:required="true" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

如果是安卓6.0以及以上系统,还需要动态获取权限。

2. 导入jar包和so文件

3. 愉快的使用

方法

  • 初始化设备
    public int Init();
    返回值参考常量
  • 关闭设备
    public int Close();
    返回值参考常量
  • SDK 版本
    public String GetVersion ();
  • 获取图像大小
    public int GetImageSize(int []pnWidth, int []pnHeight);
    pnWidth 图像宽度
    pnHeight 图像高度
    返回值参考常量
  • 检测手指
    public int DetectFinger(int[]isPressed)
    isPressed =0 手指抬起 =1 手指按下
    返回值参考常量
  • 上传原始图像
    public int GetImageRawData(byte[]pRawData);
    pRawData 图像大小 pnWidth*pnHeight
    返回值参考常量
  • 获取图像质量
    public int GetImageScore(byte[] pRawData,int nWidth, int nHeight);
    pRawData 图像大小 pnWidth*pnHeight
    pnScore 大于 IMAGE_SCORE 合格
    返回值参考常量
  • 将原始图像转换成 bmp
    public Bitmap ImageRawDataToBmp(byte[] pRawData, int nWidth, int
    nHeight);
  • 特征提取
    public int Extract(byte[] pRawData,int nWidth, int nHeight,byte[]
    pfeature);
    pRawData 图像大小 nWidth * nHeight
    pfeature 特征大小 FEATURE_LENTH
    返回值参考常量
  • 将三个特征转换成模板
    public int Enroll(byte[] pfeature1,byte[] pfeature2,byte[]
    pfeature3,byte[] pTemplate);
    pfeature1, pfeature2, pfeature3, pTemplate 大小 FEATURE_LENTH
    返回值参考常量
    一般将模板保存在后台数据库, 便于后期识别验证。FPW(M)指纹系列产品开发手册
    杭州蚁创科技有限公司
  • 指纹匹配
    public int Match(byte[] pfeature,byte[] pTemplate,int iLevel);
    两个特征相互匹配
    MATCH_LOW_LEVEL<=iLevel<= MATCH_HIGH_LEVEL,建议 3
    返回值参考常量
  • 搜索
    public int Search(byte[] pfeature1,byte[] pTemplate_n,int nTemplate);
    特征 pfeature1 大小 FEATURE_LENTH
    模 板 数 据 pTemplate_n 按 照 FTP_MAX_SIZE 的 长 度 累 计 长 度 为 nTemplate
    *FEATURE_LENTH
    模板个数 nTemplate
    返回成功的索引 pIndex
    最大个数 10000, 如果超过该限制, 与相关人员联系。

扩展

支付宝,腾讯等大厂都制定了自己的协议,标准直接和设备厂商合作,而应用方只有微信和支付宝自己。支付宝指纹支付标准是 IFAA ,腾讯的指纹支付标准是 SOTER,也就是说没有其他应用方会使用这个标准。所以很看应用方和设备厂商的协商程度。现在 IFAA 没有开源,只有 SOTER 是开源的了
如果接入,我们能省去兼容性测试的工作量,而且有些 6.0 以下的机型 SOTER 也支持。每个指纹将会有唯一 ID,也就是说,可以能把账号和指纹绑定起来,更加安全。
不过需要注意的是 SOTER 没支持华为等机型,而且以后机型的扩展受第三方支持的限制。

指纹开发常见问题

兼容问题

  1. 明明符合条件,isHardwareDetected() 返回 false?
    表现机型:MI 5s、vivo X9
    在同一机型上调用 FingerprintManagerCompat 的 isHardwareDetected() 和 hasEnrolledFingerprints() 时候,返回的都是 false,但是调用 FingerprintManager 的 isHardwareDetected()
    和 hasEnrolledFingerprints() 时,却是返回 true。
    解决:是否符合指纹条件可以多加一层判断。
  2. Letv X500 Android 6.0,API23 不按正常的套路回调
    onAuthenticationError 和 onAuthenticationFailed,理论上应该是识别失败的情况,但是该机型点击取消指纹识别也会先回调一次Error,如果遇到这种情况,只能根据具体项目环境中去进行规避适配了。
  3. 魅族上遇到的坑
    onAuthenticationHelp 回调不按套路出牌,正常官网文档解释,这个方法的回调时机是在指纹认证期间发生可恢复性的错误时回调。结果在魅族上,启动指纹识别认证的时候就会回调这个方法,里面传递回来的信息提示是“等待按下手指”,也就是说,它的 onAuthenticationHelp 回调跟官网时机不一样,而且方法的作用也变了,它在正常的情况回调了 onAuthenticationHelp。
    解决:不影响验证流程,无需解决
  4. 小米 锁屏和切后台生命周期不一致
    产品需求:用户锁屏或切到后台时(onStop)自动停止指纹验证,回到界面时(onResume)自动调起验证。
    所以我在指纹回调方法中加入了标志位 isInAuth。onStop时保存 isInAuth,onResume时 isInAuth == true 则自动调起验证。
      @Overridepublic void onAuthenticationSucceeded(FingerprintManagerCompat.AuthenticationResult result) {isInAuth = false;}@Overridepublic void onAuthenticationError(int errMsgId, CharSequence errString) {isInAuth = false;}@Overridepublic void onAuthenticationFailed() {isInAuth = true;}@Overridepublic void onAuthenticationHelp(int helpMsgId, CharSequence helpString) {isInAuth = true;}

然而小米6、米mix2 锁屏时的生命周期是 onAuthenticationError -> onStop;切到后台是 onStop -> onAuthenticationError。导致不同流程下拿到 isInAuth 标志位不一致,无法自动调起验证。
解决:界面指纹按钮可以手动调起验证,无需兼容处理。
小米5生命周期同上,但是无论是自动还是手动调起验证,马上就回调了 onAuthenticationError,也就是说 MI5 从后台切回来后,指纹验证流程中断。
解决:用一个栈来存储调用方法顺序,如果验证方法调起,马上就回调 onAuthenticationError 方法,则判定是属于兼容问题,按验证失败来解决。
5. 密钥解密失败
三星SM-A9100 、Nexus 6P密钥解密失败
解决:暂无法解决

其他兼容解决方案:

三星passSdk(不过从2018下半年开始,Pass SDK 将不再提供 DEVICE_FINGERPRINT_UNIQUE_ID 。也就是不再为每个已注册的指纹提供索引了。因此将无法通过 SDK 区分使用哪个指纹来验证用户。)

魅族 flyme开发平台提供了指纹验证官方api

非兼容问题

  1. 新注册指纹密钥解密失败
    系统中注册了一个新的指纹的情况下,即使指纹在系统指纹列表里,验证也不通过。
    解决:删除了当前无效的key,然后根据参数再次生成密钥。
@Overridepublic void onAuthenticationSucceeded(FingerprintManagerCompat.AuthenticationResult result) {      /*** doFinal方法会检查结果是不是会拦截或者篡改过,* 如果是的话会抛出一个异常,异常的时候都将认证当做是失败来处理*/try {result.getCryptoObject().getCipher().doFinal();mCustomCallback.onAuthenticationSucceeded(true);} catch (IllegalBlockSizeException e) {//如果是新录入的指纹,会抛出该异常,需要重新生成密钥对重新验证,这里加个次数限制,避免进入验证异常->重新验证->又验证异常的死循环if (happenCount == 0) {beginAuthenticate();happenCount++;return;}mCustomCallback.onAuthenticationSucceeded(false);} catch (Exception e) {mCustomCallback.onAuthenticationSucceeded(false);}...}
  1. 设备已有指纹,生成密钥却异常提示没有指纹
    非复现,和设备无关,怀疑是谷歌 API 的坑。
    java.lang.IllegalStateException: At least one fingerprint must be enrolled to create keys requiring user authentication for every use

解决:暂时只想到针对这个特定异常,直接使用无密钥验证,有一定的安全风险。

文章推荐

  • Android开发学习之路-指纹识别api https://www.cnblogs.com/Fndroid/p/5204986.html
  • Android指纹识别深入浅出分析到实战(6.0以下系统适配方案) https://www.cnblogs.com/popfisher/p/6063835.html
  • 如何在复杂业务场景中优雅实现Android指纹验证? https://www.jianshu.com/p/ed880f35f97f
  • Android指纹识别,看这一篇就够了 https://blog.csdn.net/love_xiaozhao/article/details/81316145

指纹模块开发-FPW(M)指纹系列产品相关推荐

  1. 传苹果开发ChatGPT类的AI产品;iPhone 15 Pro系列或将涨价;PyTorch 2.0 发布 |极客头条

    「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧. 整理 | 梦依丹 出品 | CSDN(ID:CSDNnews ...

  2. 独家!了不起的UP系列产品,不一样的开发板—UP Core Plus Board(四)

    为了犒劳研扬科技的忠实粉丝,我非常荣幸的为大家带来一个好消息:研扬科技UP系列产品又出新品了--UP Core Plus Board. 首先,为大家带来几张细节图片,让大家一饱眼福哦~ 产品介绍: U ...

  3. java开发门禁指纹,指纹门禁

    大兀人脸识别控制系统+USB指纹仪+DW9拓扑图(指纹为java系统直接采集.云或控制板直接比对,无需二次注册,人脸为htttp上传服务器或rtsp视频流比对方案) 大兀活体指纹门禁采用BS架构,已集 ...

  4. 万国数据联合阿里云发布混合云系列产品 助力企业落地云端

    云栖大会北京峰会近日在北京国家会议中心隆重召开,国内领先的高可用数据中心基础设施和服务提供商之一万国数据受邀参会,并基于阿里云平台发布了CloudMiX混合云系列产品.此次发布的一系列混合云服务产品包 ...

  5. RDIFramework.NET-.NET快速信息化系统开发整合框架 【开发实例 EasyUI】之产品管理(MVC版)...

    RDIFramework.NET-.NET快速信息化系统开发整合框架 [开发实例 EasyUI]之产品管理(MVC版) RDIFramework.NET-.NET快速开发整合框架 [开发实例]之产品管 ...

  6. 惠普台式计算机系列,惠普发布设计笔记本、设计台式电脑等Z系列产品

    惠普发布新一代惠普Z系列产品,包含设计笔记本.设计台式电脑.显示器和VR等产品. 惠普Z系列设计笔记本HP ZBook 14u G6配有4K显示屏,支持100% Adobe RGB色域显示,拥有600 ...

  7. 赛锐信息-AMS系列产品简介

    AMS系列产品是国内首个用于SAP权限风险识别的增强系统,也是同行业用户精益化管理解决方案中最优的解决方案,作为用户管理.风险规避和信息审计的辅助工具,其有助于规范企业的管理行为,帮助建立合规的管控流 ...

  8. 阅面携手英特尔发布“繁星”系列产品,推动机器视觉迈入AI芯片新纪元

    让机器视觉技术以更低门槛普及,是不少AI公司的核心愿景. 阅面科技,正是这样愿景下创立的关键玩家.现在,阅面交出初步成绩单. 11月1日,阅面科技携手英特尔重磅发布"繁星"系列产品 ...

  9. 鸿蒙电视应用市场,任正非:鸿蒙系统已上线,未来将被应用到手机、平板、电视系列产品上...

    鸿蒙系统已经完成了从面向物联网到面向智能设备的转化. 鸿蒙系统已经上线,未来将被应用到华为智能硬件系列产品上. 1月21日,时隔5年,华为创始人任正非再次亮相达沃斯世界经济论坛,在接受媒体采访时透露了 ...

最新文章

  1. FIE2020-2020年的论文相关记录
  2. AutoMapper 入门
  3. 基于textureview编写opengl程序
  4. 关于Unity中NGUI的Pivot和锚点
  5. HALCON示例程序train_characters_ocr.hdev使用SVM分类器训练字体
  6. linux之/usr/local/bin和/usr/bin区别
  7. 如何用10万资金炒房到1000万
  8. -bash-退出_为什么这么多开发人员在找到工作之前就退出了。 请-不要。
  9. Python画图实战之画K线图【附带自动下载股票数据】
  10. FreeMarker基本操作(二)
  11. PopupWindow正确使用方式
  12. 【二分答案】【Heap-Dijkstra】bzoj2709 [Violet 1]迷宫花园
  13. 在MongoDB中实现聚合函数
  14. Qt制作音乐播放器按钮
  15. 台式计算机 评标细则,计算机评标系统流程.doc
  16. 苹果手机如何查看html代码,苹果手机怎么利用代号查看硬件信息
  17. 韩文打字速度测试软件,韩语软件推荐:好用的韩语拼写分写检查器
  18. 基本数学概念——数列
  19. win2016开启ntp_Windows Server 2016-Windows 时间服务概览
  20. 使用新版FLIR (FLIR_ADAS_v2) 训练Faster RCNN模型

热门文章

  1. 企业转型升级,务必抓住“企业上云”政策红利
  2. 【商业信息】PNP ID注册名单 2019-05-21
  3. 浅谈IT行业中的隐私泄露问题
  4. 东方欲晓,莫道君行早
  5. 杂项-职位-软件测试工程师:软件测试工程师
  6. 点击echarts柱状图动态改变数据项颜色样式
  7. C#随机函数Radom问题详解
  8. Node.js 下载与安装教程
  9. 数学复习全程规划及方法指导(武忠祥笔记)
  10. 用友安装时显示加密服务器,用友云主机指向加密服务器