原生Android Java调用系统指纹识别方法

在Android中调用系统指纹识别API

Android从API 23(Android 6.0)开始提供了系统级的指纹识别支持。以下是使用系统API实现指纹识别的完整步骤:

1. 添加权限和特性声明

首先在AndroidManifest.xml中添加必要权限:

xml 复制代码
<uses-permission android:name="android.permission.USE_BIOMETRIC" />
<uses-permission android:name="android.permission.USE_FINGERPRINT" /> <!-- 兼容旧版本 -->

2. 检查设备支持情况

在调用指纹识别前,需要检查:

java 复制代码
private boolean checkFingerprintAvailability(Context context) {
    FingerprintManager fingerprintManager = null;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        fingerprintManager = context.getSystemService(FingerprintManager.class);
    }
    
    if (fingerprintManager == null) {
        return false;
    }
    
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (!fingerprintManager.isHardwareDetected()) {
            // 设备不支持指纹识别
            return false;
        }
        
        if (!fingerprintManager.hasEnrolledFingerprints()) {
            // 用户未录入任何指纹
            return false;
        }
    }
    
    return true;
}

3. 创建指纹识别回调

java 复制代码
private FingerprintManager.AuthenticationCallback authenticationCallback = 
    new FingerprintManager.AuthenticationCallback() {
        @Override
        public void onAuthenticationError(int errorCode, CharSequence errString) {
            // 指纹验证出错
            showToast("验证出错: " + errString);
        }

        @Override
        public void onAuthenticationHelp(int helpCode, CharSequence helpString) {
            // 帮助信息
            showToast("帮助: " + helpString);
        }

        @Override
        public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) {
            // 验证成功
            showToast("验证成功");
            // 执行成功后的操作
        }

        @Override
        public void onAuthenticationFailed() {
            // 验证失败
            showToast("验证失败");
        }
    };

4. 启动指纹识别

java 复制代码
@RequiresApi(api = Build.VERSION_CODES.M)
private void startFingerprintAuthentication(Context context) {
    FingerprintManager fingerprintManager = context.getSystemService(FingerprintManager.class);
    
    try {
        CancellationSignal cancellationSignal = new CancellationSignal();
        
        // 可选: 设置取消操作
        cancellationSignal.setOnCancelListener(() -> {
            // 用户取消了验证
        });
        
        // 使用指纹管理器进行验证
        fingerprintManager.authenticate(
            null, // 加密对象,可以为null
            cancellationSignal,
            0, // flags
            authenticationCallback,
            null // handler
        );
    } catch (Exception e) {
        e.printStackTrace();
    }
}

5. 完整示例代码

java 复制代码
public class FingerprintHelper {
    private Context context;
    private CancellationSignal cancellationSignal;

    public FingerprintHelper(Context context) {
        this.context = context;
    }

    public boolean isFingerprintAvailable() {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
            return false;
        }
        
        FingerprintManager fingerprintManager = context.getSystemService(FingerprintManager.class);
        return fingerprintManager != null 
            && fingerprintManager.isHardwareDetected()
            && fingerprintManager.hasEnrolledFingerprints();
    }

    @RequiresApi(api = Build.VERSION_CODES.M)
    public void startListening(FingerprintManager.AuthenticationCallback callback) {
        try {
            FingerprintManager fingerprintManager = context.getSystemService(FingerprintManager.class);
            cancellationSignal = new CancellationSignal();
            
            fingerprintManager.authenticate(
                null, // 加密对象
                cancellationSignal,
                0, // flags
                callback,
                null // handler
            );
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void stopListening() {
        if (cancellationSignal != null) {
            cancellationSignal.cancel();
            cancellationSignal = null;
        }
    }
}

6. 使用BiometricPrompt (API 28+推荐)

对于Android 9.0(API 28)及以上版本,推荐使用BiometricPrompt:

java 复制代码
private void showBiometricPrompt() {
    BiometricPrompt.PromptInfo promptInfo = new BiometricPrompt.PromptInfo.Builder()
        .setTitle("指纹验证")
        .setSubtitle("请验证您的指纹")
        .setNegativeButtonText("取消")
        .build();

    BiometricPrompt biometricPrompt = new BiometricPrompt(
        activity,
        ContextCompat.getMainExecutor(context),
        new BiometricPrompt.AuthenticationCallback() {
            @Override
            public void onAuthenticationError(int errorCode, CharSequence errString) {
                super.onAuthenticationError(errorCode, errString);
                // 处理错误
            }

            @Override
            public void onAuthenticationSucceeded(BiometricPrompt.AuthenticationResult result) {
                super.onAuthenticationSucceeded(result);
                // 验证成功
            }

            @Override
            public void onAuthenticationFailed() {
                super.onAuthenticationFailed();
                // 验证失败
            }
        });

    biometricPrompt.authenticate(promptInfo);
}

注意事项

  1. 在Android 10及以上版本,FingerprintManager已被标记为过时,推荐使用BiometricPrompt
  2. 确保在调用指纹识别前检查权限
  3. 处理各种可能的错误情况
  4. 考虑不同Android版本的兼容性
  5. 在适当的时候取消指纹识别(如Activity销毁时)

以上代码提供了在Android中使用系统指纹识别API的基本框架,可以根据实际需求进行调整和扩展。

我们的交流群:570375849

相关推荐
阿巴斯甜5 小时前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker6 小时前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq95277 小时前
Andorid Google 登录接入文档
android
黄林晴8 小时前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
冬奇Lab21 小时前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿1 天前
Android MediaPlayer 笔记
android
Jony_1 天前
Android 启动优化方案
android
阿巴斯甜1 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android
张小潇1 天前
AOSP15 Input专题InputReader源码分析
android
_小马快跑_1 天前
Kotlin | 协程调度器选择:何时用CoroutineScope配置,何时用launch指定?
android