应用启动时如何仅调用一次Biometric Authentication?
仅在应用启动时触发一次生物认证的实现方案
1. 引入生物认证依赖
首先在模块级build.gradle中添加官方兼容库,避免不同厂商、不同系统版本的适配问题:
dependencies { implementation "androidx.biometric:biometric:1.1.0" }
2. 自定义全局Application管理认证状态
全局存储认证状态,同时监听Activity生命周期,保证仅在应用冷启动、第一个Activity加载时触发认证:
// 自定义Application类 public class MyApp extends Application { // 全局认证标记,默认未认证 public boolean isAuthenticated = false; @Override public void onCreate() { super.onCreate(); // 注册Activity生命周期回调 registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() { private int activityCount = 0; @Override public void onActivityResumed(@NonNull Activity activity) { activityCount++; // 仅当第一个Activity启动、且未完成认证时触发认证 if (activityCount == 1 && !isAuthenticated) { showBiometricAuth(activity); } } @Override public void onActivityPaused(@NonNull Activity activity) { activityCount--; } // 其他生命周期回调空实现即可 @Override public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) {} @Override public void onActivityStarted(@NonNull Activity activity) {} @Override public void onActivityStopped(@NonNull Activity activity) {} @Override public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState) {} @Override public void onActivityDestroyed(@NonNull Activity activity) {} }); } // 生物认证弹窗逻辑 private void showBiometricAuth(Activity activity) { BiometricPrompt.PromptInfo promptInfo = new BiometricPrompt.PromptInfo.Builder() .setTitle("身份验证") .setSubtitle("请验证身份以使用应用") .setNegativeButtonText("取消") .build(); BiometricPrompt biometricPrompt = new BiometricPrompt(activity, new Executor() { @Override public void execute(Runnable command) { command.run(); } }, new BiometricPrompt.AuthenticationCallback() { @Override public void onAuthenticationSucceeded(@NonNull BiometricPrompt.AuthenticationResult result) { super.onAuthenticationSucceeded(result); // 认证成功,修改全局标记 isAuthenticated = true; } @Override public void onAuthenticationFailed() { super.onAuthenticationFailed(); // 认证失败,关闭应用 activity.finishAffinity(); } @Override public void onAuthenticationError(int errorCode, @NonNull CharSequence errString) { super.onAuthenticationError(errorCode, errString); // 认证取消/出错,关闭应用 activity.finishAffinity(); } }); biometricPrompt.authenticate(promptInfo); } }
写完后记得在AndroidManifest.xml的application标签中添加android:name=".MyApp"指定自定义Application。
3. 增加全局校验防止绕过(可选但推荐)
创建BaseActivity作为所有业务Activity的父类,每次Activity创建时校验认证状态,避免用户通过深链、后台恢复等方式绕开认证:
public class BaseActivity extends AppCompatActivity { @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); MyApp app = (MyApp) getApplicationContext(); if (!app.isAuthenticated) { // 未认证直接关闭所有页面 finishAffinity(); } } }
注意事项
- 上述实现仅在应用冷启动(进程创建)时触发一次认证,应用退到后台再切回只要进程未被销毁不会重复触发,符合需求
- 如果需要支持用户未开启生物识别时的密码验证降级,可在
onAuthenticationError回调中判断错误码,跳转密码验证页面 - 所有业务逻辑页面都需继承BaseActivity,避免出现校验漏洞
内容的提问来源于stack exchange,提问作者divss
相关产品推荐
相关产品推荐

