检查用户是否更改了 Android 中的生物识别/指纹

2024-01-01

我正在寻找一种在用户更改指纹时收到通知的方法。 我看到了这个答案here https://stackoverflow.com/questions/44515668/android-fingerprint-detect-new-finger-added但不清楚在这种情况下如何使用“setAllowedAuthenticators”。

如果有人可以提供帮助,我将不胜感激。

【更新】更新后的代码:

1-生成密钥

generateSecretKey(new KeyGenParameterSpec.Builder(
                        KEY_NAME,
                        KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
                        .setBlockModes(KeyProperties.BLOCK_MODE_CBC)
                        .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7)
                        .setUserAuthenticationRequired(true)
                        // Invalidate the keys if the user has registered a new biometric
                        // credential, such as a new fingerprint. Can call this method only
                        // on Android 7.0 (API level 24) or higher. The variable
                        .setInvalidatedByBiometricEnrollment(true)
                        .build());

2-生成密码

       Cipher cipher = getCipher();
            SecretKey secretKey = getSecretKey();
            try {
                cipher.init(Cipher.ENCRYPT_MODE, secretKey);
            } catch (KeyPermanentlyInvalidatedException e) {
                System.out.print("key has changed");
            } catch (InvalidKeyException e) {
                e.printStackTrace();
            }

3-验证

biometricPrompt.authenticate(new CancellationSignal(), excutor, new BiometricPrompt.AuthenticationCallback() {


            @Override
            public void onAuthenticationSucceeded(BiometricPrompt.AuthenticationResult result) {

                    }
                });
            }
        });
    }
});

Error:

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.fingerprint_poc, PID: 9523
java.lang.IllegalArgumentException: keystoreAlias must not be empty
    at android.security.keystore.KeyGenParameterSpec$Builder.<init>(KeyGenParameterSpec.java:760)
    at com.example.fingerprint_poc.task$5.onClick(task.java:153)
    at android.view.View.performClick(View.java:6597)
    at android.view.View.performClickInternal(View.java:6574)
    at android.view.View.access$3100(View.java:778)
    at android.view.View$PerformClick.run(View.java:25885)
    at android.os.Handler.handleCallback(Handler.java:873)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:193)
    at android.app.ActivityThread.main(ActivityThread.java:6669)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)    I/Process: Sending signal. PID: 9523 SIG: 9

使用此处的功能link https://developer.android.com/training/sign-in/biometric-auth#crypto and link https://developer.android.com/training/sign-in/biometric-auth#biometric-only您在身份验证之前添加此代码

Cipher cipher = getCipher();
    SecretKey secretKey = getSecretKey();
    if (getSecretKey() == null){
        generateSecretKey(new KeyGenParameterSpec.Builder(
                KEY_NAME,
                KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
                .setBlockModes(KeyProperties.BLOCK_MODE_CBC)
                .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7)
                .setUserAuthenticationRequired(true)
                // Invalidate the keys if the user has registered a new biometric
                // credential, such as a new fingerprint. Can call this method only
                // on Android 7.0 (API level 24) or higher. The variable
                .setInvalidatedByBiometricEnrollment(true)
                .build());
    }
    try {
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
    } catch (KeyPermanentlyInvalidatedException e) {
        System.out.print("key has changed");

        Toast.makeText(task.this, "changed", Toast.LENGTH_LONG).show();

        generateSecretKey(new KeyGenParameterSpec.Builder(
                KEY_NAME,
                KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
                .setBlockModes(KeyProperties.BLOCK_MODE_CBC)
                .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7)
                .setUserAuthenticationRequired(true)
                // Invalidate the keys if the user has registered a new biometric
                // credential, such as a new fingerprint. Can call this method only
                // on Android 7.0 (API level 24) or higher. The variable
                .setInvalidatedByBiometricEnrollment(true)
                .build());
    } catch (InvalidKeyException e) {
        e.printStackTrace();

    }

重要的:KEY_NAME 必须相同,并且在实例之间不得更改。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

检查用户是否更改了 Android 中的生物识别/指纹 的相关文章

  • gradle更新后无法找到方法(无法编译项目)

    我尝试将项目中的 gradle 版本更新为 4 1 milestone 1 以下这些说明 https developer android com studio build gradle plugin 3 0 0 migration html
  • 检查 WebView 元素时的 UiAutomator 错误

    I have recently started automation testing in android and was using UiAutomator tool for inspecting UI elements Surprisi
  • 如何自定义菜单项的背景颜色?

    我正在尝试定制Toolbar的弹出菜单 现在我无法设置菜单项的背景颜色 我的 styles xml 如下所示
  • Recyclerview 动态部分不使用任何第三个库

    我想将标头添加到 recyclerview 我正在尝试使用来实现它 Override public int getItemViewType int position depends on your problem if position 0
  • 如何使用 Google Maps for Android V2 处理地图移动结束?

    我想在地图中心更改后立即对地址进行地理编码 如何使用新的 Android 版 Google 地图 V2 处理地图移动 我说的是用户用手指拖动地图的情况 查看新的地图 API Override public void onMapReady G
  • 通过 WhatsApp 发送消息

    由于我发现了一些较旧的帖子 表明 Whatsapp 不支持此功能 我想知道是否发生了变化 以及是否有办法打开与我通过意图发送的号码进行 Whatsapp 聊天 UPDATE请参阅https faq whatsapp com en andro
  • 如何更改终端的默认目录?

    我想更改 Android Studio v2 2 2 终端的默认目录 当我打开终端时 它基于项目的目录 C 项目路径 我经常需要使用adb shell 所以我必须导航到 SDK 路径 平台工具 才能使用 adb 命令 是否可以更改终端的默认
  • 以编程方式将文本颜色设置为主要 Android 文本视图

    如何设置我的文本颜色TextView to android textColorPrimary以编程方式 我已经尝试了下面的代码 但它将 textColorPrimary 和 textColorPrimary Inverse 的文本颜色始终设
  • ExoPlayer2 - 如何使 HTTP 301 重定向工作?

    我开始使用 ExoPlayer 来传输一些音频 一切都很顺利 直到我遇到一个带有 301 永久移动 重定向的 URL ExoPlayer2 默认情况下不处理该问题 我已经看过这个线程 https github com google ExoP
  • 当它的父级是 ConstraintLayout 时设计 CardView 吗?

    我在编辑包含Relativelayout的Cardview内的RelativeLayout时搞砸了 ConstraintLayout会将相对布局的wrap content更改为0并添加工具 layout editor absoluteX 1
  • Android 手机作为 GSM 调制解调器在 PC 上发送/接收短信?

    是否可以将 Android 移动设备用作 PC 上的 GSM 调制解调器 我正在 net下开发应用程序来发送 接收短信等 现在我想通过 USB 将我的 Android 设备连接到我的 PC 并将其用作 GSM 调制解调器来与其通信 这里是参
  • 对于一个单元格,RecyclerView onBindViewHolder 调用次数过多

    我正在将 RecyclerView 与 GridLayoutManager 一起使用 对于网格中的每个项目 我需要调用 REST api 来检索数据 然后 从远程异步获取数据后 我使用 UIL 加载 显示图像 一切似乎都很好 但我发现 on
  • 我应该释放或重置 MediaPlayer 吗?

    我有自己的自定义适配器类 称为 WordAdapter 并且我正在使用媒体播放器 名为pronounce WordAdapter 类中的全局变量 我有不同的活动 其中每个列表项都有线性布局 名为linearLayout 我正在设置onCli
  • 在命令行上卸载 Android SDK 的选定部分

    这与 卸载旧的 Android SDK 版本 https stackoverflow com questions 15182377 uninstall old android sdk versions 除非我想在无头 Linux CI 服务
  • 如何检查 Android 中的同步设置

    我正在构建一个 Android 应用程序 我需要检查设备中注册的每个单独帐户的同步设置 我知道我可以通过 ContentResolver 类来做到这一点 但我遇到了一些问题 我已设法获取设备上所有帐户的列表 但我不知道在运行时从哪里获取特定
  • 通过电子邮件发送文本文件附件

    我正在尝试附加一个文本文件以便通过电子邮件发送 但每当我打开电子邮件应用程序时 它都会说该文件不存在 请帮助 Intent i new Intent Intent ACTION SEND i setType text plain i put
  • CamcorderProfile.videoCodec 返回错误值

    根据docs https developer android com reference android media CamcorderProfile html 您可以使用CamcorderProfile获取设备默认视频编解码格式 然后将其
  • 我的应用程序中的后退按钮出现问题[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想在手机关闭时清除共享首选项值 你
  • Android 后台倒计时器

    我有一个 Android 应用程序 它管理一个倒计时器 类 CountDownTimer 它显示在应用程序屏幕中 以显示到达 00 00 还剩多少时间 我现在的问题是 当我按主页按钮或启动另一个应用程序时 应用程序 计时器不会在后台运行 所
  • 发布的 Android apk 出现错误“包文件未正确签名”

    我最近将我的应用程序上传到 Android 市场 但是由于错误 下载时它拒绝运行 包文件未正确签名 我首先使用 eclipse 发布了数据包 右键单击导出 创建密钥库然后发布 但它拒绝工作 然后我下载了 keytool 和 jarsigne

随机推荐

  • 实例新类型(Golang)

    谁能告诉我如何从字符串创建 Type 的新实例 反映 有一些示例 但它们适用于较旧的 Go 1 之前的版本 语言 所以 如果我正确理解你的问题 你是在问当你只有类型名称作为字符串时如何创建一个对象 例如 您可能有一个字符串 MyStruct
  • java.io.File:访问文件名编码无效的文件

    因为 java io File 的构造函数采用 java lang String 作为参数 所以似乎无法告诉它在访问文件系统层时需要哪种文件名编码 因此 当您通常使用 UTF 8 作为文件名编码并且有一些文件名包含编码为 ISO 8859
  • Rails 将脚本作为后台作业执行

    我有一个已作为独立功能实现的 ruby 脚本 现在我想在我的 Rails 环境中执行这个脚本 但将其作为后台作业执行会增加难度 因为它需要大量的时间处理 添加delayed job gem后 我尝试调用以下句子 delay system r
  • 发现 ASP.NET Core 中的通用控制器

    我正在尝试创建一个像这样的通用控制器 Route api controller public class OrdersController
  • 如何摆脱 wasm_bindgen 包装结构中的生命周期

    目前我有一些类似于以下的代码 Lifetime of child is enforced to be valid as far as Parent is valid struct Child lt a gt some data i32 ph
  • MySQL可重复读隔离级别和丢失更新现象

    In 高性能 Java 持久性 https vladmihalcea com books high performance java persistence 书的6 3 3 3部分写道 在MySQL可重复读隔离级别中可能会出现丢失更新现象
  • 如何使用Python的加密模块加载RSA公钥

    我正在尝试使用加载公钥密码学 https cryptography io 模块 这就是密钥的样子 gt gt gt print pubkey BEGIN RSA PUBLIC KEY MIGfMA0GCSqGSIb3DQEBAQUAA4GN
  • 为什么 Scala 的 Symbol 不被接受作为列引用?

    尝试 Spark SQL 的示例 它们似乎工作得很好 除非需要表达式 scala gt val teenagers people where age gt 10 where age lt 19 select name
  • Java 库运行时与编译时

    当使用 Tomcat 作为应用程序服务器设置 Java Web 应用程序时 我经常对库何时可用感到困惑 通过 Stack Overflow 上的一些讨论 我了解到一些库 jar 文件在运行时可用 而另一些则在编译时可用 我经常会遇到错误 并
  • UITableView选择的indexpath值给出错误

    Team 我有 UITableView 其中有 50 个以上的单元格数 每个单元格的宽度为 60 当我滚动到 20 个单元格时 然后点击任何单元格 它给出了单元格值之上的索引路径值 而不是单击单元格值 内部 CellForRowAtInde
  • 启用包还原时如何指定 nuget 包的位置?

    我正在开发 net 解决方案并使用 nuget 进行包管理 我选择了 启用 Nuget 包还原 选项 以便 nuget 包不会签入源代码管理 在此之前 我有一个与解决方案处于同一级别的 nuget config 文件 其中我包含以下内容 使
  • 在Silverlight中,如何知道代码是否在UI线程中运行?

    基本上我需要知道是否需要 Dispatcher BeginInvoke 或者是否不需要 Thanks 您可以使用Dispatcher CheckAccess http msdn microsoft com en us library sys
  • useEffect 运行后测试更改后的状态

    我使用 ReactJs jest 和 React 测试库 我有这个代码 const App data gt const state setState useState after useEffect runs state should be
  • git 重新连接到远程存储库

    我犯了一个巨大的错误 导致我的项目的本地版本不再与其曾经关联的远程存储库连接 是否有一些技巧可以重新建立连接 关联而不破坏代码的本地版本 你试过了吗 git remote add track master origin url to git
  • Linux 下双显示器设置上的 SDL 假全屏模式

    使用SDL 1 3我想在linux下创建假全屏SDL Window 如果我只有一台显示器 这很容易 我刚刚获得当前显示模式并创建了一个窗口 SDL GetDesktopDisplayMode 0 mode SDL Window win SD
  • Java 有 uudecoding 的标准机制吗?

    我正在编写一个 Java 程序来从 POP3 电子邮件下载附件 最初 如果内容类型经过验证 我会通过获取 MimePart 的输入流来实现此目的 然后我可以简单地通过 FileOutputStream 将输入流写入本地文件 然而 我遇到的一
  • 使用 JSTL 循环遍历 Map [重复]

    这个问题在这里已经有答案了 我正在寻找 JSTL 循环Map
  • 如何在 Firebase 中按应用版本阻止用户

    我有一个 Android 应用程序 它使用 Firebase 作为一般聊天室 用户输入昵称并开始聊天 实施没有问题 我的应用程序运行良好 但问题在于数据使用 由于实施错误 数据使用率过高 在应用程序版本 14 中 我正在获取聊天室中的所有数
  • 如果双引号字符串以转义反斜杠结尾,则词法分析器规则会保持匹配字符,就好像它们是带引号字符串的一部分一样

    如果双引号字符串以转义的反斜杠结尾 则词法分析器规则会变得贪婪并保持匹配字符 就好像它们是带引号的字符串的一部分一样 然后词法分析器认为实际开始下一个带引号的字符串的双引号正在结束第一个字符串 并在后面的字符上给出语法错误 我们需要调整词法
  • 检查用户是否更改了 Android 中的生物识别/指纹

    我正在寻找一种在用户更改指纹时收到通知的方法 我看到了这个答案here https stackoverflow com questions 44515668 android fingerprint detect new finger add