在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);
}
注意事项
- 在Android 10及以上版本,FingerprintManager已被标记为过时,推荐使用BiometricPrompt
- 确保在调用指纹识别前检查权限
- 处理各种可能的错误情况
- 考虑不同Android版本的兼容性
- 在适当的时候取消指纹识别(如Activity销毁时)
以上代码提供了在Android中使用系统指纹识别API的基本框架,可以根据实际需求进行调整和扩展。
我们的交流群:570375849
