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

Android Studio中BiometricManager创建及相关报错问题求助

指纹登录APP开发报错修复方案

跟着YouTube教程《How to Make a FingerPrint Authentication System in Android Studio and Java》开发指纹登录简易APP时,出现多处API调用报错,代码及报错信息如下:

原代码

package com.example.actividad14;

import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;

import android.graphics.Color;
import android.hardware.biometrics.BiometricManager;
import android.hardware.biometrics.BiometricPrompt;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import java.util.concurrent.Executor;

public class MainActivity extends AppCompatActivity {

    @RequiresApi(api = Build.VERSION_CODES.Q)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView msg_txt = findViewById(R.id.txt_msg);
        Button login_btn = findViewById(R.id.login_btn);

        BiometricManager biometricManager = BiometricManager.from(this);
        switch (biometricManager.canAuthenticate()){
            case BiometricManager.BIOMETRIC_SUCCESS:
                msg_txt.setText("You can use the fingerprint sensor to login");
                msg_txt.setTextColor(Color.parseColor("#Fafafa"));
                break;
            case BiometricManager.BIOMETRIC_ERROR_NO_HARDWARE:
                msg_txt.setText("The device doesn't have a fingerprint sensor");
                login_btn.setVisibility(View.GONE);
                break;
            case BiometricManager.BIOMETRIC_ERROR_HW_UNAVAILABLE:
                msg_txt.setText("The biometric sensor is currently unavailable");
                login_btn.setVisibility(View.GONE);
                break;
            case BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED:
                msg_txt.setText("Your device doesn't have any fingerprint saved, please check your security settings");
                login_btn.setVisibility(View.GONE);
                break;

        }

        Executor executor = ContextCompat.getMainExecutor(this);

        BiometricPrompt biometricPrompt = new BiometricPrompt(MainActivity.this, executor, new androidx.biometric.BiometricPrompt.AuthenticationCallback() {
            @Override
            public void onAuthenticationError(int errorCode, @NonNull CharSequence errString) {
                super.onAuthenticationError(errorCode, errString);
            }

            @Override
            public void onAuthenticationSucceeded(@NonNull androidx.biometric.BiometricPrompt.AuthenticationResult result) {
                super.onAuthenticationSucceeded(result);
                Toast.makeText(getApplicationContext(),"Login Succes!", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onAuthenticationFailed() {
                super.onAuthenticationFailed();
            }
        });

        final BiometricPrompt.PrompInfo prompInfo = BiometricPrompt.PrompInfo.Builder()
                .setTitle("Login")
                .setDescription("Use your fingerprint to login in your app")
                .setNegativeButtonText("Cancel")
                .build();

        login_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                biometricPrompt.authenticate(prompInfo);

            }
        });


    }
}

具体报错

  • BiometricManager.from(this)提示“cannot resolve method 'from' in 'biometricmanager'”
  • 创建BiometricPrompt实例提示“'BiometricPrompt' has private access in 'android.hardware.biometrics.BiometricPrompt'”
  • BiometricPrompt.PrompInfo提示“cannot resolve PromptInfo”
  • biometricPrompt.authenticate(prompInfo)提示“cannot resolve method '(authenticate(BiometricPrompt.PrompInfo))'”

报错原因及修复方案

核心原因

教程使用的是旧版系统级android.hardware.biometrics API,该API已被废弃,且与当前AndroidX生态的API结构不兼容。现在官方推荐使用Jetpack的androidx.biometric库,需替换API并调整调用逻辑。

步骤1:添加AndroidX Biometric依赖

在Module级别的build.gradle文件中添加依赖(使用最新稳定版):

dependencies {
    implementation "androidx.biometric:biometric:1.2.0"
}

步骤2:修正代码

替换所有旧API调用为AndroidX版本,同时修正拼写错误:

修正后完整代码

package com.example.actividad14;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.biometric.BiometricManager;
import androidx.biometric.BiometricPrompt;
import androidx.core.content.ContextCompat;

import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import java.util.concurrent.Executor;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView msg_txt = findViewById(R.id.txt_msg);
        Button login_btn = findViewById(R.id.login_btn);

        // 使用AndroidX的BiometricManager,修复from()方法找不到的问题
        BiometricManager biometricManager = BiometricManager.from(this);
        // 明确指定验证类型为弱生物识别(指纹)
        switch (biometricManager.canAuthenticate(BiometricManager.Authenticators.BIOMETRIC_WEAK)) {
            case BiometricManager.BIOMETRIC_SUCCESS:
                msg_txt.setText("可以使用指纹传感器登录");
                msg_txt.setTextColor(Color.parseColor("#Fafafa"));
                break;
            case BiometricManager.BIOMETRIC_ERROR_NO_HARDWARE:
                msg_txt.setText("设备没有指纹传感器");
                login_btn.setVisibility(View.GONE);
                break;
            case BiometricManager.BIOMETRIC_ERROR_HW_UNAVAILABLE:
                msg_txt.setText("生物识别传感器当前不可用");
                login_btn.setVisibility(View.GONE);
                break;
            case BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED:
                msg_txt.setText("设备未保存任何指纹,请检查安全设置");
                login_btn.setVisibility(View.GONE);
                break;
        }

        Executor executor = ContextCompat.getMainExecutor(this);

        // 使用Builder模式创建BiometricPrompt实例,修复私有构造方法的访问问题
        BiometricPrompt biometricPrompt = new BiometricPrompt.Builder(this)
                .setTitle("登录")
                .setDescription("使用指纹登录应用")
                .setNegativeButtonText("取消", executor, (dialog, which) -> {
                    // 点击取消按钮的逻辑(可根据需求补充)
                })
                .build();

        // 统一使用AndroidX的AuthenticationCallback
        BiometricPrompt.AuthenticationCallback callback = new BiometricPrompt.AuthenticationCallback() {
            @Override
            public void onAuthenticationError(int errorCode, @NonNull CharSequence errString) {
                super.onAuthenticationError(errorCode, errString);
                Toast.makeText(getApplicationContext(), "登录错误:" + errString, Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onAuthenticationSucceeded(@NonNull BiometricPrompt.AuthenticationResult result) {
                super.onAuthenticationSucceeded(result);
                Toast.makeText(getApplicationContext(), "登录成功!", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onAuthenticationFailed() {
                super.onAuthenticationFailed();
                Toast.makeText(getApplicationContext(), "指纹识别失败,请重试", Toast.LENGTH_SHORT).show();
            }
        };

        // 修正authenticate方法调用,传递执行器和回调
        login_btn.setOnClickListener(view -> biometricPrompt.authenticate(executor, callback));
    }
}

对应报错的修复点

  1. BiometricManager.from(this)报错:替换导入为androidx.biometric.BiometricManager,该类提供from()方法。
  2. BiometricPrompt私有构造报错:AndroidX版本使用BiometricPrompt.Builder创建实例,避免直接调用私有构造方法。
  3. PromptInfo找不到报错:原代码拼写错误(PrompInfo少了字母t),且AndroidX版本将提示信息集成在BiometricPrompt.Builder中,无需单独创建PromptInfo对象。
  4. authenticate方法参数错误:AndroidX版本的authenticate()方法接收执行器和回调对象,结合Builder设置的提示信息完成调用。

内容的提问来源于stack exchange,提问作者Antonio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 14:45:34