你的位置:小程序开发公司 > 小程序开发 > Android 6.0指纹识别App开发案例

Android 6.0指纹识别App开发案例

时间:2024-07-15 16:51:49 点击:269 次

在android 6.0中google终于给android系统加上了指纹识别的扶植,这个功能在iPhone上早就照旧竣事了,况且在好多厂商的定制的ROM中也齐我方里面竣事这个功能了,这个功能来的有点晚啊。在google全新发布的nexus开拓:nexus 5x和nexus 6p中齐捎带了一颗指纹识别芯片在开拓的背面小程序开发价格,如下图(图片来自网罗):

笔者手中的开拓便是图上的那台玄色的nexus 5x,话说这台机器格外顺眼呢!手感超棒! 谣言未几说,底下我出一个指纹识别的demo app,况且精通阐述怎样开发一个基于google api的指纹识别app。demo的源码在我的github上: https://github.com/CreateChance/AndroidFingerPrintDemo

Android M中的指纹识别接口

这个是最初需要柔软的问题,在骨子最先最先写app之前需要知谈最新的平台为咱们提供了那些指纹识别的接口。系数的指纹识别接口一谈在android.hardware.fingerprint这个包下,这个包中的类不是好多,如下:

api doc荟萃地址: https://developer.android.com/reference/android/hardware/fingerprint/package-summary.html 环球最佳FQ我方看下。 上头的图中,咱们看到这个包中统统有4个类,底下咱们简要先容一下他们: 1.FingerprintManager:主要用来合作料理和走访指纹识别硬件开拓 2.FingerprintManager.AuthenticationCallback这个一个callback接口,当指纹认证后系统会回调这个接口见知app认证的箝制是什么 3.FingerprintManager.AuthenticationResult这是一个示意认证箝制的类,会在回调接口中以参数给出 4.FingerprintManager.CryptoObject这是一个加密的对象类,用来保证认证的安全性,这是一个要点,底下咱们会分析。 好了,到这里咱们简要知谈了android 6.0给出的指纹识别的接口不是好多,不错说是苟简干练。

最先开发一个指纹识别app

面前,咱们要最先写一个期骗上头接口的指纹识别app,这个app界面很简陋,就一个activity,这个activity上会激活指纹识别,然后教唆用户按下指纹,况且会将认证的箝制暴露馅来。

最先

在最先之前,咱们需要知谈使用指纹识别硬件的基本人手: 1.在AndroidManifest.xml中声名如下权限:

软件开发

<uses-permission android:name="android.permission.USE_FINGERPRINT"/>

2.得到FingerprintManager的对象援用 3.在运行是查验开拓指纹识别的兼容性,比如是否有指纹识别开拓等。底下咱们精通说一下上头的身手:

声名权限

这一步相比简陋,只消在AndroidManifest.xml中添加上头说到的权限就不错了。

得到FingerprintManager对象援用

这是app开发中得到系统工作对象的常用样式,如下:

上头给出两种样式,第一种是通过V4扶植包得到兼容的对象援用,这是google施行的作念法;还有便是径直使用api 23 framework中的接口得到对象援用。

查验运行要求

要使得咱们的指纹识别app大致平素运行,有一些要求是必须得志的。

凡哥双色球第2024079期红球奖号分析:

红球冷码统计:双色球第2024078期开出红球奖号分别为:05、09、14、21、22、26,在最近300期开奖中,各号码出现之后其下期出现最少的5个红球分别为:      

1). API level 23

指纹识别API是在api level 23也便是android 6.0中加入的,因此咱们的app必须运行在这个系统版块之上。因此google推选使用 Android Support Library v4包来得到FingerprintManagerCompat对象,因为在得到的时分这个包会查验现时系统平台的版块。

2). 硬件

指纹识别详情要求你的开拓上有指纹识别的硬件,因此在运行时需要查验系统当中是不是有指纹识别的硬件:

调用上头的接口接不错知谈系统中是不是有一个这样的硬件,如果莫得的话,那就需要作念一些妥当的事情,比如教唆用户现时系统中莫得指纹识别硬件等。

3). 现时开拓必须是处于安全保护中的

这个要求的根由是,你的开拓必须是使用屏幕锁保护的,这个屏幕锁不错是password,PIN或者图案齐行。为什么是这样呢?因为google原生的逻辑便是:念念要使用指纹识别的话,必须最初使能屏幕锁才行,这个和android 5.0中的smart lock逻辑是通常的,这是因为google认为面前的指纹识别本事如故有不及之处,安全性如故不可和传统的样式相比的。 咱们不错使用底下的代码查验现时开拓是不是处于安全保护中的:

咱们使用KeyguardManager的isKeyguardSecure接口就能知谈。

4). 系统中是不是有注册的指纹

在android 6.0中,平凡app要念念使用指纹识别功能的话,用户必须最初在setting中注册至少一个指纹才行,不然是不可使用的。是以这里咱们需要查验现时系统中是不是照旧有注册的指纹信息了:

如果用户还莫得注册一个指纹的话,那么咱们的app不错教唆用户:如果念念要使用指纹是功能,请再setting中注册一个你的指纹。这里需要啰嗦一句,如果你作念过bluetooth或者其他开拓开发的话,那么你知谈你不错通过发送一个intent来启动bluetooth开启的界面,只淌若声明了蓝牙的料理权限。但是,到面前位置google任然莫得洞开让平凡app启动指纹注册界面的权限,这少量咱们不错从setting的AndroidManifest中看到:

大部分的fingerprint树立界面齐莫得exporte,只消SetupFingerprintEnrollIntroduction,但是这个界面需要android.permission.MANAGE_FINGERPRINT这个权限,况且这个权限只但是系统app使用,这就径直注意第三方app启动这个界面了。(不知谈日后google会不会洞开这个权限。。。。。)

一个好的app,应该在运行时齐查验一下上头的要求,注意app出现不测的症结。

扫描用户按下的指纹

要最先扫描用户按下的指纹是很简陋的,只消调用FingerprintManager的authenticate圭表即可,那么面前咱们来看一下这个接口:

上图是google的api文档中的形色,面前咱们挨个阐述注解一下这些参数齐是什么:

1. crypto这是一个加密类的对象,指纹扫描器会使用这个对象来判断认证箝制的正当性。这个对象不错是null,但是这样的话,就意味这app无要求信任认证的箝制,固然从表面上这个历程可能被攻击,数据不错被改革,这是app在这种情况下必须承担的风险。因此,刻薄这个参数不要置为null。这个类的实例化有点坚苦,主要使用javax的security接口竣事,后头我的demo模范中会给出一个helper类,这个类封装里面竣事的逻辑,开发者不错径直使用我的类简化实例化的历程。 2. cancel 这个是CancellationSignal类的一个对象,这个对象用来在指纹识别器扫描用户指纹的是时分取消现时的扫描操作,如果不取消的话,那么指纹扫描器会移植扫描直到超时(一般为30s,取决于具体的厂商竣事),这样的话就会相比耗电。刻薄这个参数不要置为null。 3. flags 符号位,把柄上图的文档形色,这个位暂时应该为0,这个象征位应该是保留夙昔使用的。 4. callback 这个是FingerprintManager.AuthenticationCallback类的对象,这个是这个接口中除了第一个参数以外最盘曲的参数了。当系统完成了指纹认证历程(失败或者顺利齐会)后,会回调这个对象中的接口,见知app认证的箝制。这个参数不可为NULL。 5. handler 这是Handler类的对象,如果这个参数不为null的话,那么FingerprintManager将会使用这个handler中的looper来处理来自指纹识别硬件的音尘。赓续来讲,开发这无谓提供这个参数,不错径直置为null,因为FingerprintManager会默许使用app的main looper来处理。

取消指纹扫描

上头咱们提到了取消指纹扫描的操作,这个操作是很常见的。这个时分不错使用CancellationSignal这个类的cancel圭表竣事:

这个圭表特意用于发送一个取消的敕令给特定的监听器,让其取消现时操作。 因此,小程序开发app不错在需要的时分调用cancel圭表来取消指纹扫描操作。

创建CryptoObject类对象

上头咱们分析FingerprintManager的authenticate圭表的时分,看到这个圭表的第一个参数便是CryptoObject类的对象,面前咱们看一下这个对象怎样去实例化。 咱们知谈,指纹识别的箝制可靠性瑕瑜常盘曲的,咱们详情不但愿认证的历程被一个第三方以某种样式攻击,因为咱们引入指纹认证的诡计便是要进步安全性。但是,从表面角度来说,指纹认证的历程是可能被第三方的中间件坏心攻击的,常见的攻击的技能便是禁绝和改革指纹识别器提供的箝制。这里咱们不错提供CryptoObject对象给authenticate圭表来幸免这种样式的攻击。 FingerprintManager.CryptoObject是基于Java加密API的一个包装类,况且被FingerprintManager用来保证认证箝制的完竣性。赓续来讲,用来加密指纹扫描箝制的机制便是一个Javax.Crypto.Cipher对象。Cipher对象本人会使用由应用调用Android keystore的API产生一个key来竣事上头说谈的保护功能。 为了阐述这些类之间是怎样协同使命的,这里我给出一个用于实例化CryptoObject对象的包装类代码,咱们先看下这个代码是怎样竣事的,然后再阐述注解一下为什么是这样。

上头的类会针对每个CryptoObject对象齐会新建一个Cipher对象,况且会使用由应用生成的key。这个key的名字是使用KEY_NAME变量界说的,这个名字应该是保证独一的,刻薄使用域名区别。GetKey圭表会尝试使用Android Keystore的API来领会一个key(名字便是上头咱们界说的),如果key不存在的话,那就调用CreateKey圭表新建一个key。 cipher变量的实例化是通过调用Cipher.getInstance圭表得到的,这个圭表接受一个transformation参数,这个参数制定了数据怎样加密息争密。然后调用Cipher.init圭表就会使用应用的key来完成cipher对象的实例化使命。 这里需要强调少量,在以下情况下,android会认为现时key是无效的:

1. 一个新的指纹image照旧注册到系统中 2. 现时开拓中的也曾注册过的指纹面前不存在了,可能是被一谈删除了 3. 用户关闭了屏幕锁功能 4. 用户改变了屏幕锁的样式

当上头的情况发生的时分,Cipher.init圭表齐会抛出KeyPermanentlyInvalidatedException的很是,上头我的代码中拿获了这个很是,况且删除了现时无效的key,然后把柄参数尝试再次创建。 上头的代码中使用了android的KeyGenerator来创建一个key况且把它存储在开拓中。KeyGenerator类会创建一个key,但是需要一些原始数据才能创建key,这些原始的信息是通过KeyGenParameterSpec类的对象来提供的。KeyGenerator类对象的实例化是使用它的工场圭表getInstance进行的,从上头的代码中咱们不错看到这里使用的AES(Advanced Encryption Standard )加密算法的,AES会将数据分红几个组,然后针对几个组进行加密。 接下来,KeyGenParameterSpec的实例化是使用它的Builder圭表,KeyGenParameterSpec.Builder封装了以下盘曲的信息:

1. key的名字 2. key必须在加密息争密的时分是有用的 3. 上头代码中BLOCK_MODE被树立为Cipher Block Chaining也便是KeyProperties.BLOCK_MODE_CBC,这意味着每一个被AES切分的数据块齐与之前的数据块进行了异或运算了,这样的诡计便是为了建造每个数据块之间的依赖权衡。 4. CryptoObjectHelper类使用了PKSC7(Public Key Cryptography Standard #7)的样式去产生用于填充AES数据块的字节,这样便是要保证每个数据块的大小是等同的(因为需要异或计较还有方面算法进行数据处理,精通不错巡逻AES的算法旨趣)。 5. setUserAuthenticationRequired(true)调宅心味着在使用key之前用户的身份需要被认证。 每次KeyGenParameterSpec创建的时分,他齐被用来驱动化KeyGenerator,这个对象会产生涯储在开拓上的key。

怎样使用CryptoObjectHelper呢?

底下咱们看一下怎样使用CryptoObjectHelper这个类,咱们径直看代码就知谈了:

使用是相比简陋的,最初new一个CryptoObjectHelper对象,然后调用buildCryptoObject圭表就能得到CryptoObject对象了。

处理用户的指纹认证箝制

前边咱们分析authenticate接口的时分说谈,调用这个接口的时分必须提供FingerprintManager.AuthenticationCallback类的对象,这个对象会在指纹认证末端之后系统回调以见知app认证的箝制的。在android 6.0中,指纹的扫描和认证齐是在另外一个进度中完成(指纹系统工作)的,因此底层什么时分大致完成认证咱们app是不可假定的。因此,咱们只可领受异步的操作样式,也便是当系统底层完成的时分主动见知咱们,见知的样式便是通过回调咱们我方竣事的FingerprintManager.AuthenticationCallback类,这个类中界说了一些回调圭表以供咱们进行必要的处理:

底下咱们简要先容一下这些接口的含义:

1. OnAuthenticationError(int errorCode, ICharSequence errString) 这个接口会再系统指纹认证出现不可规复的症结的时分才会调用,况且参数errorCode就给出了症结码,符号了症结的原因。这个时分app能作念的只但是教唆用户重新尝试一遍。 2. OnAuthenticationFailed() 这个接口会在系统指纹认证失败的情况的下才会回调。着重这里的认证失败和上头的认证症结是不通常的,固然箝制齐是不可认证。认证失败是指系数的信息齐汇集完竣,况且莫得任何很是,但是这个指纹和之前注册的指纹是不相符的;但是认证症结是指在汇集或者认证的历程中出现了症结,比如指纹传感器使命很是等。也便是说认证失败是一个不错预期的平素情况,而认证症结是不可预期的很是情况。 3. OnAuthenticationHelp(int helpMsgId, ICharSequence helpString) 上头的认证失败是认证历程中的一个很是情况,咱们说那种情况是因为出现了不可规复的症结,而咱们这里的OnAuthenticationHelp圭表是出现了不错恢复的很是才会调用的。什么是不错规复的很是呢?一个常见的例子便是:手指出动太快,当咱们把手指放到传感器上的时分,如果咱们很快地将手指移走的话,那么指纹传感器可能只汇集了部分的信息,因此认证会失败。但是这个症结是不错规复的,因此只消教唆用户再次按下指纹,况且不要太快移走就不错处分。 4. OnAuthenticationSucceeded(FingerprintManagerCompati.AuthenticationResult result)这个接口会在认证顺利之后回调。咱们不错在这个圭表中教唆用户认证顺利。这里需要阐述一下,如果咱们上头在调用authenticate的时分,咱们的CryptoObject不是null的话,那么咱们在这个圭表中不错通过AuthenticationResult来得到Cypher对象然后调用它的doFinal圭表。doFinal圭表会查验箝制是不是会禁绝或者改革过,如果是的话会抛出一个很是。当咱们发现这些很是的时分齐应该将认证行为念是失败来来处理,为了安全刻薄环球齐这样作念。

对于上头的接口还有2点需要补充一下:

1. 上头咱们说谈OnAuthenticationError 和 OnAuthenticationHelp圭表中会有症结或者匡助码以教唆为什么认证不堪利。Android系统界说了几个症结和匡助码在FingerprintManager类中,如下:

咱们的callback类竣事的时分最佳需要处理这些症结和匡助码。

2. 当指纹扫描器正在使命的时分,如果咱们取消本次操作的话,系统也会回调OnAuthenticationError圭表的,仅仅这个时分的症结码是FingerprintManager.FINGERPRINT_ERROR_CANCELED(值为5),因此app需要区别对待。 底下给出我的代码中竣事的callback子类:

这个子类竣事很简陋,主要的竣事样式便是将音尘抛给主界面的Handler来处理:

这里分手处理四中回调,况且针对症结码调用handleErrorCode圭表处理:

很简陋,便是针对不同的症结码,树立界面上不同的暴露笔墨,以教唆用户。这里环球不错很据我方的需要修改逻辑。 针对匡助码调用handleHelpCode圭表处理:

这里的处理和handleErrorCode是通常的。

回想

这里咱们共计一下,android 6.0上的指纹识别开发的几个要点: 1. 刻薄使用Android Support Library v4 Compatibility API,不要使用径直framework中的api。 2. 在使用指纹硬件之前一定要查验上头提到的几个查验要求 3. 把柄google的刻薄最佳使用google提供的指纹是被icon来标示你的指纹识别界面:

这个作念的诡计便是为了很明确地教唆用户这是一个指纹识别操作,就像东谈主们看到蓝牙的阿谁小符号就知谈这是蓝牙操作通常。天然,这仅仅google的一个施行性的刻薄,并非强制。 4. app需要实时见知用户现时的操作以及操作的箝制,比如需要明确告诉用户现时正在扫描指纹,请把你的指纹放在传感器上等。 5. 终末需要着重的便是Android Support Library v4中的FingerprintManager类名字是FingerprintManagerCompat,况且他们的authenticate圭表参数次序不通常,flags和cancel的位置在两个类中是不通常的,这少量需要着重(个东谈主认为,这会不会是google的造作呢???嘿嘿。。。。。)

demo运行效劳截图(运行于nexus 5x)

驱动气象

扫描气象

扫描失败(出现不错规复的症结,这里是手指出动太快)

认证失败

认证顺利

以上便是本文的一谈内容小程序开发价格,但愿对环球的学习有所匡助,也但愿环球多多扶植剧本之家。

服务热线
官方网站:kswxzls.com
工作时间:周一至周六(09:00-18:00)
联系我们
QQ:2852320325
邮箱:w365jzcom@qq.com
地址:武汉东湖新技术开发区光谷大道国际企业中心
关注公众号

Powered by 小程序开发公司 RSS地图 HTML地图

Copyright Powered by365建站 © 2013-2024 云迈科技 版权所有