使用指纹

说明 : 指纹解锁在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

ab80491c58856f1fc00f096ad7779e7f.png

指纹识别经过以后跳转到 指定页面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地址

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐