原生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

相关推荐
工程师老罗1 小时前
如何在Android工程中配置NDK版本
android
Libraeking5 小时前
破壁行动:在旧项目中丝滑嵌入 Compose(混合开发实战)
android·经验分享·android jetpack
市场部需要一个软件开发岗位5 小时前
JAVA开发常见安全问题:Cookie 中明文存储用户名、密码
android·java·安全
JMchen1237 小时前
Android后台服务与网络保活:WorkManager的实战应用
android·java·网络·kotlin·php·android-studio
crmscs8 小时前
剪映永久解锁版/电脑版永久会员VIP/安卓SVIP手机永久版下载
android·智能手机·电脑
localbob8 小时前
杀戮尖塔 v6 MOD整合版(Slay the Spire)安卓+PC端免安装中文版分享 卡牌肉鸽神作!杀戮尖塔中文版,电脑和手机都能玩!杀戮尖塔.exe 杀戮尖塔.apk
android·杀戮尖塔apk·杀戮尖塔exe·游戏分享
机建狂魔8 小时前
手机秒变电影机:Blackmagic Camera + LUT滤镜包的专业级视频解决方案
android·拍照·摄影·lut滤镜·拍摄·摄像·录像
hudawei9968 小时前
flutter和Android动画的对比
android·flutter·动画
lxysbly10 小时前
md模拟器安卓版带金手指2026
android
儿歌八万首10 小时前
硬核春节:用 Compose 打造“赛博鞭炮”
android·kotlin·compose·春节