You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

应用启动时如何仅调用一次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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 06:51:03