在这篇博客中,我们将介绍如何使用 Flutter 的 local_auth
插件在 Android 和 iOS 设备上实现指纹识别功能。通过这一步一步的实现,我们将学习如何检查设备是否支持生物识别、如何触发指纹验证,并处理可能出现的错误。
效果图(因为录屏时系统不能录制指纹页面,所以黑屏;实际跑起来是正常的:
1. 安装 local_auth
插件
插件地址:https://pub.dev/packages/local_auth
在 pubspec.yaml
文件中添加了 local_auth
插件依赖:
dependencies:flutter:sdk: flutterlocal_auth: ^2.1.3
2. 修改 Android 配置
2.1 在 AndroidManifest.xml
文件中添加权限,以允许应用访问生物识别硬件:
<uses-permission android:name="android.permission.USE_BIOMETRIC"/>
<uses-permission android:name="android.permission.USE_FINGERPRINT"/>
2.2 MainActivity
继承自 FlutterFragmentActivity,并且注册插件引擎
package com.example.test1import io.flutter.embedding.android.FlutterFragmentActivity;
import io.flutter.plugins.GeneratedPluginRegistrant
import io.flutter.embedding.engine.FlutterEngineclass MainActivity: FlutterFragmentActivity() {override fun configureFlutterEngine(flutterEngine: FlutterEngine) {GeneratedPluginRegistrant.registerWith(flutterEngine)}
}
2.3 在android/app/src/main/res/values/styles.xml 文件下这样改:
<style name="LaunchTheme" parent="Theme.AppCompat.DayNight">
3. 实现指纹识别功能
接下来,我们编写 Flutter 代码,使用 local_auth
插件实现指纹识别。我们的应用将包含以下功能:
- 检查设备是否支持指纹识别。
- 在支持指纹识别的设备上执行身份验证。
以下是主要的 Flutter 代码:
import 'dart:io';import 'package:flutter/material.dart';
import 'package:local_auth/local_auth.dart';
import 'package:flutter/services.dart';
import 'package:local_auth_ios/local_auth_ios.dart';
import 'package:local_auth_android/local_auth_android.dart';void main() {runApp(const MyApp());
}class MyApp extends StatelessWidget {const MyApp({super.key});@overrideWidget build(BuildContext context) {return MaterialApp(title: '指纹识别 Demo',theme: ThemeData(primarySwatch: Colors.blue,),home: const FingerprintDemo(),);}
}class FingerprintDemo extends StatefulWidget {const FingerprintDemo({super.key});@override_FingerprintDemoState createState() => _FingerprintDemoState();
}class _FingerprintDemoState extends State<FingerprintDemo> {final LocalAuthentication auth = LocalAuthentication();String _message = "请点击按钮进行指纹识别";bool haveFingerprint = false;// 检查设备是否支持生物识别--手机必须要设置密码和开启指纹功能Future<void> _checkBiometricSupport() async {haveFingerprint = await isSupportBiometric();setState(() {if (haveFingerprint) {_message = "设备支持指纹识别";} else {_message = "该设备不支持指纹识别";}});}// 尝试进行指纹识别Future<void> _authenticateWithFingerprint() async {try {bool authenticated = await auth.authenticate(localizedReason: ' ',authMessages: [const AndroidAuthMessages(biometricHint: '扫描指纹进行身份验证',cancelButton: '取消',signInTitle: '指纹验证',),const IOSAuthMessages(lockOut: '验证身份失败,请重新验证',cancelButton: '取消',)],options: const AuthenticationOptions(useErrorDialogs: false,biometricOnly: true,));setState(() {if (authenticated) {_message = "指纹验证成功";} else {_message = "指纹验证失败";}});} on PlatformException catch (e) {setState(() {_message = "错误: ${e.message}";});}}isSupportBiometric() async {late List<BiometricType> availableBiometrics;try {availableBiometrics = await auth.getAvailableBiometrics();print(availableBiometrics);if (availableBiometrics.isNotEmpty) {if (Platform.isIOS) {if (availableBiometrics.contains(BiometricType.fingerprint)) {return true;}} else {return true;}}} on PlatformException catch (e) {availableBiometrics = <BiometricType>[];print(e);}return false;}@overridevoid initState() {super.initState();_checkBiometricSupport(); // 启动时检查设备支持情况}@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text("指纹识别 Demo"),),body: Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[Text(_message,style: const TextStyle(fontSize: 20),),const SizedBox(height: 20),ElevatedButton(onPressed: _authenticateWithFingerprint,child: const Text("使用指纹验证"),),],),),);}
}
4.代码解析
注意:只有手机设置了密码和开启了指纹功能才可以用这个功能
-
_checkBiometricSupport
:首先检查设备是否支持指纹识别。通过调用auth.getAvailableBiometrics()
来获取设备支持的生物识别类型。如果设备支持指纹识别或面部识别,将更新_message
。 -
_authenticateWithFingerprint
:触发指纹验证。如果设备支持并且用户点击按钮,应用会弹出指纹识别对话框,并根据用户的验证结果更新_message
。 -
isSupportBiometric
:通过调用auth.getAvailableBiometrics()
来获取设备支持的生物识别类型。如果设备支持指纹或面部识别,返回true
。 -
AuthenticationOptions
:配置local_auth
插件的一些选项,如禁用默认的错误对话框(useErrorDialogs: false
)和只允许使用生物识别进行验证(biometricOnly: true
)。
总结
通过本文,我们介绍了如何使用 local_auth
插件实现 Flutter 应用中的指纹识别功能。通过设置合适的配置和调用插件提供的 API,你可以轻松地在 Android 和 iOS 设备上实现生物识别验证功能。