使用统一接口兼容库 BiometricPromptCompat 简化你的 Android 生物识别解锁支持

@fython  June 6, 2018

不知不觉,指纹识别解锁已经完成普及很久,当年 Google 在 Android 6.0 版本(SDK 23)方才加入统一的接口,如今已有很多应用程序适配支持了。 FingerprintManager 确实提供了非常便捷的接口供开发者,但没有统一的界面,需要应用程序各自实现自己的 UI,结果出来的效果五花八门、体验一般。

现在 Android P 为开发者们换来了更加简单的 BiometricPrompt,由系统来提供统一的界面,也为更多的生物识别传感器解锁支持提供可能(字面意思上的理解,现在使用 Biometric 一词取代了 Fingerprint),未来系统允许第三方应用面容特征解锁时,开发者亦无需再额外编写代码接入。

介绍 BiometricPromptCompat

源码地址: https://github.com/fython/BiometricPromptCompat

BiometricPromptCompat 是为兼容低版本 Android 而设计的,它的界面十分接近于原版 BiometricPrompt 以保证在不同的 Android 上有一致的效果。

当然在 Android P 或者更新的版本我们还会用原来的 BiometricPrompt 接口,尽管不能保证不同设备上的界面一致,因为系统厂商们会以他们的风格重新设计。(但没有关系,我认为系统厂商有权利统一自己的系统风格,而且不同的生物识别解锁也需要不同的界面)

我们需要意识到在 Android 6.0~8.1 版本中只有指纹传感器会被支持,很抱歉我暂时没有计划去适配成千上万系统中不相容的接口们。

基本需求

  • Platform SDK for Android P (android-28)
  • Android Studio 3.1+

举个例子

我们推荐在使用这个库前先了解 FingerprintManager 或 BiometricPrompt 的使用,所有你想知道的都可以在那找到。

首先引入依赖到你的应用 Module 中(build.gradle):

dependencies {
     implementation 'moe.feng.support.biometricprompt:library:1.0.0'
}

接下来通过 BiometricPromptCompat.isHardwareDetected(Context) 来得知硬件是否支持(会包括 Android 版本检查)。

经过确认后,才可开始构建对话框并开始认证:

final BiometricPromptCompat biometricPrompt = new BiometricPromptCompat.Builder(context)
        .setTitle("标题")
        .setSubtitle("副标题")
        .setDescription("描述:吧啦吧啦吧啦吧啦吧啦……")
        .setNegativeButton("使用密码", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Toast.makeText(
                    context,
                    "你请求了密码解锁。",
                    Toast.LENGTH_LONG).show();
            }
        })
        .build();

biometricPrompt.authenticate(cancellationSignal, myCallback);

相关链接

FingerprintManager 参考

BiometricPrompt 参考

Android P Preview 改动介绍中的生物识别解锁部分说明

效果展示

Android 8.1

Android-O.png

Android P Preview

Android-P.png

还有……

支付宝、微信为何不使用统一接口?

众所周知,支付宝和微信的指纹支付功能欲为 Android 所用还需系统中置入他们的私有库并获得他们的认证方可使用,两家中国互联网巨头不约而同道如此做法是为了安全,甚有相关原理分析文章发表(微信 SOTER)。假设 Google 真的在过去留下了坑,随时时间推移他们也会发现问题存在并解决,而国内这些方案为何又不被采纳入 AOSP 中。

从某厂热门手游的 “高帧率模式支持” 一词被炒热来看,这些不兼容的接口支持,或为一种软件厂商给予硬件厂商的营销手段,与此同时自己也在高权限空间占有一席之地,当中的利益关系不容小觑。

结果或好或坏,为了小部分破解获得 root 权限又不注重软件安全的用户的数据、财产安全而牺牲了所有使用非国产系统或手机的用户体验,实在划不来。国内直接使用 Android 原生接口的软件数不胜数,单是美团、招商银行就有相当大的用户量了,我们也应该放心地去使用统一接口。

怎样同时使用用户设定的 PIN、图案锁定作为解锁方式

早在 Android 5.0 KeyguardManager 就提供了 createConfirmDeviceCredentialIntent 方法可以创建一个打开系统设置认证界面的 Intent,它的解锁方式会与锁屏保持一致,使用 startActivityForResult 去获取结果,当结果为 RESULT_OK 时则通过解锁。

这是一个依赖系统设置界面的 API 用的人比较少,不确定各个国产系统上的行为表现是否稳定,使用前建议先调查可用性(尤其是 MIUI)。


添加新评论

  1. prpr~
    感谢饼提供了 https://developer.android.com/reference/android/app/KeyguardManager#createConfirmDeviceCredentialIntent(java.lang.CharSequence,%20java.lang.CharSequence) 这个 API,找了好久了..

    Reply