开篇寄语
现在的智能手机,一般是Android或者是iOS系统,都是支持指纹识别或者是面部识别的,对应的一些应用就会利用此功能进行隐私保护,比如银行类的App,黄色影视类的App等等都会应用这些功能,以增强隐私,让用户用着放心。在flutter中就有一个插件,名字叫做local_auth,可以很容易实现这类需求。那么该如何实现呢?请看本篇文章。
前情提要
内容详情
以下内容是更改lib下的main.dart文件内容,删掉里面的内容,复制粘贴代码,开启调试就可以出现了。
首先是安装local_auth这个依赖库,在terminal中输入以下命令:
flutter pub add local_auth
回车后就开始安装了,安装完成后,则需要开启iOS和Android的使用权限。
先来说一下在iOS中,如果想要开启人脸识别的话,则需要添加下面这行代码:
<key>NSFaceIDUsageDescription</key> <string>Why is my app authenticating using face id?</string>
具体位置可以参看下面这张图片:
接下来是Android,找到如下位置:android/app/src/main/kotlin/com/MainActivity.kt,更新代码为:
package com.example.my_app import io.flutter.embedding.android.FlutterFragmentActivity import io.flutter.embedding.engine.FlutterEngine import io.flutter.plugins.GeneratedPluginRegistrant import io.flutter.embedding.android.FlutterActivity class MainActivity: FlutterFragmentActivity() { override fun configureFlutterEngine(flutterEngine: FlutterEngine) { GeneratedPluginRegistrant.registerWith(flutterEngine) } }
接着在进入这个位置:android/app/src/main/AndroidManifest.xml,增加以下一条权限:
<uses-permission android:name="android.permission.USE_FINGERPRINT"/>
如下图所示:
好的,做完这些之后,返回到main.dart这个文件,哦,忘了说了,再提前安装一个简单的动态过渡动画,在terminal输入以下命令:
flutter pub add transparent_image
安装完成后,将main.dart文件换上下面的代码:
// ignore_for_file: prefer_const_constructors import 'package:flutter/material.dart'; import 'package:local_auth/local_auth.dart'; import 'package:transparent_image/transparent_image.dart' show kTransparentImage; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { const MyApp({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return const MaterialApp( debugShowCheckedModeBanner: false, title: 'Flutter Example', home: LocalAuthExample(), ); } } class LocalAuthExample extends StatefulWidget { const LocalAuthExample({Key? key}) : super(key: key); @override _LocalAuthExampleState createState() => _LocalAuthExampleState(); } class _LocalAuthExampleState extends State<LocalAuthExample> { bool _authSuccess = false; late LocalAuthentication _localAuth; @override void initState() { super.initState(); _localAuth = LocalAuthentication(); } Future<bool> _auth() async { setState(() => _authSuccess = false); if (await _localAuth.canCheckBiometrics == false) { ScaffoldMessenger.of(context).showSnackBar( const SnackBar( content: Text('Your device is NOT capable of checking biometrics.\n' 'This demo will not work on your device!\n' 'You must have android 6.0+ and have fingerprint sensor.'), ), ); return false; } try { final authSuccess = await _localAuth.authenticate( localizedReason: 'Auth in to see hidden image', biometricOnly: true); ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text('authSuccess=$authSuccess')), ); return authSuccess; } catch (e) { ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text(e.toString())), ); return false; } } @override Widget build(BuildContext context) { return Column( children: <Widget>[ Padding(padding: EdgeInsets.only(top: 20)), ElevatedButton( child: Text('Click Me'), onPressed: () async { final authSuccess = await _auth(); setState(() => _authSuccess = authSuccess); }, ), if (_authSuccess) FadeInImage( placeholder: MemoryImage(kTransparentImage), image: const AssetImage('assets/images/dartlearning.jpg'), ) else const Placeholder(), ], ); } }
运行后效果如下图所示:
点击click就会进入指纹识别或者人脸识别模式,因为并没有在真机上运行,所以无法看到效果,如果在真机演示是可以看到效果的,类似于这样(以一个例子的图来说):
当点击指纹后,出现弹窗提示,要求进行指纹识别,如下图所示:
指纹识别成功后,如下图所示:
- 我的微信
- 微信扫一扫加好友
- 我的微信公众号
- 扫描关注公众号