使用指纹

说明 : 指纹解锁在23 的时候,官方就已经给出了api ,可是因为Android市场复杂,没法造成统一,硬件由不一样的厂商开发,致使相同版本的软件系统,搭载的硬件变幻无穷,致使由的机型不支持指纹识别,可是,这也挡不住指纹识别在接下来的时间中进入Android市场的趋势,由于它相比较输入密码或图案,它更加简单,相比较密码或者图案,它更炫酷 ,本文Demo 使用最新的28 支持的androidx 库中的API及最近火热的kotlin语言完成的java

须要知道的

FingerprintManager : 指纹管理工具类

FingerprintManager.AuthenticationCallback :使用验证的时候传入该接口,经过该接口进行验证结果回调

FingerprintManager.CryptoObject: FingerprintManager 支持的分装加密对象的类

以上是28如下API 中使用的类 在Android 28版本中google 宣布使用Androidx 库代替Android库,因此在28版本中Android 推荐使用androidx库中的类 因此在本文中我 使用的是推荐是用的FingerprintManagerCompat 两者的使用的方式基本类似android

如何使用指纹

开始验证 ,系统默认的每段时间验证指纹次数为5次 次数用完以后自动关闭验证,而且30秒以内不允行在使用验证

验证的方法是authenticate()git

/**

*

*@param crypto object associated with the call or null if none required.

*@param flags optional flags; should be 0

*@param cancel an object that can be used to cancel authentication

*@param callback an object to receive authentication events

*@param handler an optional handler for events

**/

@RequiresPermission(android.Manifest.permission.USE_FINGERPRINT)

public void authenticate(@Nullable CryptoObject crypto, int flags,

@Nullable CancellationSignal cancel, @NonNull AuthenticationCallback callback,

@Nullable Handler handler) {

if (Build.VERSION.SDK_INT >= 23) {

final FingerprintManager fp = getFingerprintManagerOrNull(mContext);

if (fp != null) {

android.os.CancellationSignal cancellationSignal = cancel != null

? (android.os.CancellationSignal) cancel.getCancellationSignalObject()

: null;

fp.authenticate(

wrapCryptoObject(crypto),

cancellationSignal,

flags,

wrapCallback(callback),

handler);

}

}

}

arg1: 用于经过指纹验证取出AndroidKeyStore中key的值

arg2: 系统建议为0 github

arg3: 取消指纹验证 手动关闭验证 能够调用该参数的cancel方法web

arg4:返回验证结果api

arg5: Handler fingerprint 中的

消息都是经过handler来传递的 若是不须要则传null 会自动默认建立一个主线程的handler来传递消息ide

使用指纹识别的条件

添加权限(这个权限不须要在6.0中作处理)

判断硬件是否支持

是否已经设置了锁屏 而且已经有一个被录入的指纹

判断是否至少存在一条指纹信息

经过零碎的知识完成一个Demo

指纹识别经过以后跳转到 指定页面svg

进入以后首先弹出对话框,进行指纹验证工具

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical">

android:layout_height="wrap_content"

android:layout_gravity="center"

android:src="@drawable/fingerprint" />

android:layout_height="wrap_content"

android:layout_gravity="center"

android:layout_marginTop="20dp"

android:text="验证指纹" />

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_gravity="center"

android:layout_marginTop="10dp"

android:maxLines="1" />

android:layout_height="0.5dp"

android:layout_marginLeft="5dp"

android:layout_marginTop="10dp"

android:layout_marginRight="5dp"

android:background="#696969" />

android:layout_width="wrap_content"

android:layout_height="50dp"

android:layout_gravity="center"

android:gravity="center"

android:text="取消"

android:textSize="16sp" />

使用DialogFragment 完成对话框 新建一个DialogFragment 而且初始化相关的api ui

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

//获取fingerprintManagerCompat对象

fingerprintManagerCompat = FingerprintManagerCompat.from(context!!)

setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme_Material_Light_Dialog)

}

在界面显示在前台的时候开始扫描

override fun onResume() {

super.onResume()

startListening()

}

@SuppressLint("MissingPermission")

private fun startListening() {

isSelfCancelled = false

mCancellationSignal = CancellationSignal()

fingerprintManagerCompat.authenticate(FingerprintManagerCompat.CryptoObject(mCipher), 0, mCancellationSignal, object : FingerprintManagerCompat.AuthenticationCallback() {

//验证错误

override fun onAuthenticationError(errMsgId: Int, errString: CharSequence?) {

if (!isSelfCancelled) {

errorMsg.text = errString

if (errMsgId == FingerprintManager.FINGERPRINT_ERROR_LOCKOUT) {

Toast.makeText(mActivity, errString, Toast.LENGTH_SHORT).show()

dismiss()

mActivity.finish()

}

}

}

//成功

override fun onAuthenticationSucceeded(result: FingerprintManagerCompat.AuthenticationResult?) {

MainActivity.startActivity(mActivity, true)

}

//错误时提示帮助,好比说指纹错误,咱们将显示在界面上 让用户知道状况

override fun onAuthenticationHelp(helpMsgId: Int, helpString: CharSequence?) {

errorMsg.text = helpString

}

//验证失败

override fun onAuthenticationFailed() {

errorMsg.text = "指纹验证失败,请重试"

}

}, null)

}

在不可见的时候中止验证

if (null != mCancellationSignal) {

mCancellationSignal.cancel()

isSelfCancelled = true

}

在MainActivity 中首先判断是否验证成功 是 跳转到目标页 不然的话须要进行验证

在这个过程当中咱们须要作的就是判断是否支持,判断是否知足指纹验证的条件(条件在上面)

if (intent.getBooleanExtra("isSuccess", false)) {

WelcomeActivity.startActivity(this)

finish()

} else {

//判断是否支持该功能

if (supportFingerprint()) {

initKey() //生成一个对称加密的key

initCipher() //生成一个Cipher对象

}

}

验证条件

if (Build.VERSION.SDK_INT < 23) {

Toast.makeText(this, "系统不支持指纹功能", Toast.LENGTH_SHORT).show()

return false

} else {

val keyguardManager = getSystemService(KeyguardManager::class.java)

val managerCompat = FingerprintManagerCompat.from(this)

if (!managerCompat.isHardwareDetected) {

Toast.makeText(this, "系统不支持指纹功能", Toast.LENGTH_SHORT).show()

return false

} else if (!keyguardManager.isKeyguardSecure) {

Toast.makeText(this, "屏幕未设置锁屏 请先设置锁屏并添加一个指纹", Toast.LENGTH_SHORT).show()

return false

} else if (!managerCompat.hasEnrolledFingerprints()) {

Toast.makeText(this, "至少在系统中添加一个指纹", Toast.LENGTH_SHORT).show()

return false

}

}

必须生成一个加密的key 和一个Cipher对象

//生成Cipher

private fun initCipher() {

val key = keyStore.getKey(DEFAULT_KEY_NAME, null) as SecretKey

val cipher = Cipher.getInstance(KeyProperties.KEY_ALGORITHM_AES + "/"

+ KeyProperties.BLOCK_MODE_CBC + "/"

+ KeyProperties.ENCRYPTION_PADDING_PKCS7)

cipher.init(Cipher.ENCRYPT_MODE, key)

showFingerPrintDialog(cipher)

}

//生成一个key

private fun initKey() {

keyStore = KeyStore.getInstance("AndroidKeyStore")

keyStore.load(null)

val keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore")

val builder = KeyGenParameterSpec.Builder(DEFAULT_KEY_NAME,

KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT)

.setBlockModes(KeyProperties.BLOCK_MODE_CBC)

.setUserAuthenticationRequired(true)

.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7)

keyGenerator.init(builder.build())

keyGenerator.generateKey()

}

Demo 是kotlin 写的

Demo地址

android xml 指纹动画,Android 指纹识别(给应用添加指纹解锁)相关推荐

  1. android 图片查看动画,Android 共享动画实现点击列表图片跳转查看大图页面

    主要内容使用系统提供的 API 实现共享动画 在实现过程中遇到的问题图片点击和关闭之后会出现短暂的黑屏问题实现的动画效果如下: 共享动画.gif 具体实现这个效果是在两个页面之间的切换动画,既然是两个 ...

  2. android 上下扫描动画,Android扫描雷达动画

    很简单的一个组合动画,用好基本动画啥子效果都不怕 老规矩先上图 效果图.gif ok 来 既然往下翻那就看看如何实现的吧 首先效果分为两部分 第一部分中间指针(其实这里就是一张图片) 第二部分就是波纹 ...

  3. android 缩放透明动画,Android旋转、平移、缩放和透明度渐变的补间动画

    android实现旋转.平移.缩放和透明度渐变的补间动画,具体实现如下: 1.在新建项目的res目录中,创建一个名为anim的目录,并在该目录中创建实现旋转.平移.缩放和透明度渐变的动画资源文件. 透 ...

  4. android覆盖扩散动画,[Android]多层波纹扩散动画——自定义View绘制

    之前整理过一些属性动画的基本操作,这一段时间的动画相关需求都安然度过了.直到这次-- 一.另一种动画需求 多数交互中的动画都是让单个页面元素动起来,这种就很适合用属性动画实现.但是对于 多个元素.非页 ...

  5. android 自定义帧动画,Android 自定义方式实现帧动画效果

    前言 首先说下为啥要通过自定义处理的方式去实现Android的帧动画效果,因为通过系统原生支持的xml和java代码这两种方式实现,在播放的图片量很多时,会出现内存溢出,此现象也是在做项目当中有遇到, ...

  6. android程序启动动画,Android设置软件启动动画(以及初次安装的几张引导图)

    Android设置软件启动动画(以及初次安装的几张引导图) 设置软件启动动画 1 创建一个启动Activity 这里叫做QiDongActivity 它的XML中设置一个matchparent的背景图 ...

  7. android view退出动画,android animation——view进来退出动画

    在设计android项目的时候我们有时候需要对activity的进入退出做一些动画处理,虽然android自身已经做了动画处理,但是我们需要更加炫酷的动画就需要自己去写一些动画了. 有时候不光acti ...

  8. android p过度动画,android 过渡动画

    一.Activity的转场动画 1.overridePendingTransition(enterAnim, exitAnim); 重写Activity的 overridePendingTransit ...

  9. android 滑动翻转动画,Android编程实现3D滑动旋转效果的方法

    本文实例讲述了Android编程实现3D滑动旋转效果的方法.分享给大家供大家参考,具体如下: 这里我们通过代码实现一些滑动翻页的动画效果. Animation实现动画有两个方式:帧动画(frame-b ...

  10. android 上下收缩动画,Android 带有弹出收缩动画的扇形菜单实例

    最近试着做了个Android 带有弹出收缩动画的扇形菜单,留个笔记记录一下. 效果如下 public class MainActivity extends AppCompatActivity impl ...

最新文章

  1. 杭电1280java实现
  2. 【转】Microsoft Teams快速上手系列-01Teams的前世今生
  3. day28 java的集合(6)Properties和TreeSet
  4. java序列化方式性能比较
  5. mysql认证包_mysql协议分析2---认证包
  6. 李刚-我的全栈之路导师之一
  7. 各类排序算法思想及计算复杂度
  8. Adobe illustrator如何修改默认字体
  9. linux命令行 teamview,linux下安装team viewer的方法
  10. 有序回归: Ordinal Regression的理解
  11. 阿里云在线温湿度-小熊派qpython(综合展示)
  12. android学习笔记----手机号码查询归属地
  13. mysql udal_mysql分表分区
  14. arcEngine开发之IMapControl接口
  15. linux读取class下的文件路径,Class类getResource方法获取文件路径
  16. Cef开发学习 - Windows平台简易的Cef浏览器,支持下载管理和多标签管理
  17. HBO Max for Mac(HBO Max客户端)
  18. c语言输入10个评委分数,vb输入10个评委给的分数,去掉最高分和最低分
  19. java freemind_java环境变量的应用:为Freemind配置Java环境
  20. 从公有云到软件定义数据中心,微软发动混合云总攻势

热门文章

  1. 4.业务架构·应用架构·数据架构实战 --- 业务驱动的应用架构设计
  2. 1. Composer 简介
  3. 17. JavaScript Math(算数)对象
  4. java 静态成员 概念_Java成员变量、局部变量、静态变量、成员方法、全局方法等概念的区别...
  5. jquery中的css() animate() width()的都可以运用相对值
  6. mac+nginx+php70+mysql环境搭建
  7. 使用malloc分别分配2KB的空间,然后用realloc调整为6KB的内存空间,打印指针地址...
  8. grub的boot loader安装在磁盘上的位置
  9. CentOS 7下安装QT5.8
  10. markDown零碎整理