Flutter人脸活体检测插件passive_face_liveness的使用
Flutter人脸活体检测插件passive_face_liveness的使用
插件介绍
此插件调用Android和iOS的原生SDK。如有关于插件的任何疑问,请发送邮件至我们的移动部门负责人:daniel.seitenfus@combateafraude.com。
隐私政策和使用条款
使用本插件时,请确保您已同意我们的隐私政策和使用条款。
前置条件
在开始使用此插件之前,请确保满足以下配置要求:
配置项 | 版本 |
---|---|
Flutter | 1.12+ |
Dart | 2.12+ |
Android API | 21+ |
iOS | 11.0+ |
如果您的Dart版本低于2.12,请参阅此处找到兼容版本:兼容版本。
配置步骤
Android
在ROOT_PROJECT/android/app/build.gradle
文件中添加以下内容:
android {
...
dataBinding.enabled = true
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
}
iOS
在ROOT_PROJECT/ios/Podfile
文件末尾添加以下内容:
source 'https://github.com/combateafraude/iOS.git'
source 'https://cdn.cocoapods.org/' # 或者 'https://github.com/CocoaPods/Specs' 如果CDN不可用
最后,在ROOT_PROJECT/ios/Runner/Info.plist
文件中添加相机权限:
<key>NSCameraUsageDescription</key>
<string>为了捕捉自拍照</string>
如果您希望启用语音和文本的葡萄牙语支持,请在项目中打开ROOT_PROJECT/ios
目录下的.xcworkspace文件,并在Project > Info > Localizations中添加葡萄牙语(巴西)。
Flutter依赖配置
在pubspec.yaml
文件中添加插件依赖:
dependencies:
passive_face_liveness:
git:
url: https://github.com/combateafraude/Flutter.git
ref: passive-face-liveness-v4.28.1 # 稳定版
或者
dependencies:
passive_face_liveness:
git:
url: https://github.com/combateafraude/Flutter.git
ref: passive-face-liveness-v4.28.0-rc01 # 测试候选版
使用示例
以下是一个完整的示例,展示了如何使用该插件进行人脸活体检测:
import 'package:passive_face_liveness/android/settings.dart';
import 'package:passive_face_liveness/android/video_capture.dart';
import 'package:passive_face_liveness/ios/ios_resolution.dart';
import 'package:passive_face_liveness/ios/settings.dart';
import 'package:passive_face_liveness/show_preview.dart';
import 'package:flutter/material.dart';
import 'package:passive_face_liveness/passive_face_liveness.dart';
import 'package:passive_face_liveness/result/passive_face_liveness_failure.dart';
import 'package:passive_face_liveness/result/passive_face_liveness_result.dart';
import 'package:passive_face_liveness/result/passive_face_liveness_success.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:passive_face_liveness/message_settings.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
String _result = "";
String _description = "";
String mobileToken = ""; // 替换为实际的mobileToken
@override
void initState() {
super.initState();
requestPermissions();
}
void requestPermissions() async {
await [
Permission.camera,
].request();
}
void startPassiveFaceLiveness() async {
String result = "";
String description = "";
PassiveFaceLiveness passiveFaceLiveness =
new PassiveFaceLiveness(mobileToken: mobileToken);
PassiveFaceLivenessAndroidSettings passiveFaceLivenessAndroidSettings =
new PassiveFaceLivenessAndroidSettings(
showButtonTime: 25000, enableSwitchCameraButton: true);
passiveFaceLiveness.setCaptureMode(videoCapture: VideoCapture(use: true, time: 3));
PassiveFaceLivenessIosSettings iosSettings = new PassiveFaceLivenessIosSettings(resolution: IosResolution.HD1280x720, compressionQuality: 1);
passiveFaceLiveness.setIosSettings(iosSettings);
passiveFaceLiveness.setAndroidSettings(passiveFaceLivenessAndroidSettings);
// 设置其他参数
PassiveFaceLivenessResult passiveFaceLivenessResult =
await passiveFaceLiveness.start();
if (passiveFaceLivenessResult is PassiveFaceLivenessSuccess) {
result = "成功!";
description += "\n\timagePath: " +
passiveFaceLivenessResult.imagePath +
"\n\timageUrl: " +
(passiveFaceLivenessResult.imageUrl != null
? passiveFaceLivenessResult.imageUrl.split("?")[0] + "..."
: "null") +
"\n\tsignedResponse: " +
(passiveFaceLivenessResult.signedResponse != null
? passiveFaceLivenessResult.signedResponse
: "null");
} else if (passiveFaceLivenessResult is PassiveFaceLivenessFailure) {
result = "失败!";
description = "\tType: " +
passiveFaceLivenessResult.type +
"\n\tMessage: " +
passiveFaceLivenessResult.message;
} else {
result = "关闭!";
}
if (!mounted) return;
setState(() {
_result = result;
_description = description;
});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('PassiveFaceLiveness插件示例'),
),
body: Container(
margin: const EdgeInsets.all(20.0),
child: Column(
children: [
Row(
children: [
ElevatedButton(
child: Text('启动人脸活体检测'),
onPressed: () async {
startPassiveFaceLiveness();
},
)
],
),
Row(
children: [
Container(
margin: EdgeInsets.only(top: 10.0),
child: Text("结果: $_result"))
],
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Expanded(
child: Text("描述:\n$_description",
overflow: TextOverflow.clip),
)
],
),
],
))));
}
}
关闭安全验证以进行测试
我们不断努力使产品更加安全,减少身份欺诈的可能性。SDK包含一些可能在某些环境中阻止执行的限制。为了禁用它们,您可以使用以下方法:
PassiveFaceLivenessAndroidSettings androidSettings =
PassiveFaceLivenessAndroidSettings(
emulatorSettings: true,
rootSettings: true,
useDeveloperMode: true,
useAdb: true,
useDebug: true,
);
passiveFaceLiveness.setAndroidSettings(androidSettings);
注意! 仅在测试环境中禁用安全验证。在生产环境中发布应用时,请使用默认设置。
通用定制选项
以下是可用于定制的通用选项:
.passiveFaceLiveness.setPeopleId(String peopleId); // 用户的CPF用于防欺诈分析
.passiveFaceLiveness.setPersonName(String personName); // 将尝试进行活体检测与一个名称关联
.passiveFaceLiveness.setPersonCPF(String personCPF); // 将尝试进行活体检测与一个CPF关联
.passiveFaceLiveness.setAnalyticsSettings(bool useAnalytics); // 启用/禁用数据分析收集
.passiveFaceLiveness.setAudioSettings(bool enable, String audioResIdName); // 启用/禁用声音,允许自定义音频
.passiveFaceLiveness.setShowPreview(ShowPreview showPreview); // 预览以检查照片质量
.passiveFaceLiveness.setCaptureMode(VideoCapture videoCapture, ImageCapture imageCapture); // 定义捕获设置
.passiveFaceLiveness.setGetImageUrlExpireTime(String expireTime); // 定义图像URL在服务器上的过期时间
.passiveFaceLiveness.setMessageSettings(MessageSettings messageSettings); // 自定义消息设置
.passiveFaceLiveness.setCurrentStepDoneDelay(bool showDelay, int delay); // 应用延迟以在每一步完成后显示
.passiveFaceLiveness.setAndroidSettings(PassiveFaceLivenessAndroidSettings androidSettings); // 仅适用于Android的定制设置
.passiveFaceLiveness.setIosSettings(PassiveFaceLivenessIosSettings iosSettings); // 仅适用于iOS的定制设置
.passiveFaceLiveness.setEyesClosedSettings(bool enable, double threshold); // 自定义眼睛闭合验证
.passiveFaceLiveness.setCaptureProcessingErrorMessage(@NonNull @StringRes Integer message); // 自定义处理或API响应错误时的消息
收集结果
PassiveFaceLiveness
对象返回的结果类型为抽象类PassiveFaceLivenessResult
。它可能是PassiveFaceLivenessSuccess
、PassiveFaceLivenessFailure
或PassiveFaceLivenessClosed
的实例。
PassiveFaceLivenessSuccess
{
String imagePath; // 图像在设备上的完整路径
String capturePath; // 视频在设备上的完整路径,若非视频格式则返回null
String imageUrl; // 存储在CAF服务器上的图像URL
String signedResponse; // 来自CAF服务器的签名响应,确认捕获的自拍照是真实的
String trackingId; // 执行的唯一标识符
}
PassiveFaceLivenessFailure
{
String message; // 失败原因的友好消息
String type; // 导致SDK终止的失败类型
}
更多关于Flutter人脸活体检测插件passive_face_liveness的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter人脸活体检测插件passive_face_liveness的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
passive_face_liveness
是一个用于 Flutter 的插件,主要用于人脸活体检测。它通过被动的方式(即不需要用户进行特定的动作)来检测人脸是否为真实的人脸,而不是照片或视频中的图像。以下是如何在 Flutter 项目中使用 passive_face_liveness
插件的步骤:
1. 添加依赖
首先,你需要在 pubspec.yaml
文件中添加 passive_face_liveness
插件的依赖:
dependencies:
flutter:
sdk: flutter
passive_face_liveness: ^1.0.0 # 请使用最新版本
然后运行 flutter pub get
来安装依赖。
2. 导入插件
在你的 Dart 文件中导入 passive_face_liveness
插件:
import 'package:passive_face_liveness/passive_face_liveness.dart';
3. 初始化插件
在使用插件之前,通常需要对其进行初始化:
void initializePlugin() async {
await PassiveFaceLiveness.initialize();
}
4. 开始活体检测
你可以通过调用 startLivenessDetection
方法来启动活体检测:
void startLivenessDetection() async {
try {
final result = await PassiveFaceLiveness.startLivenessDetection();
if (result.isLive) {
print("活体检测通过,检测到真实人脸");
} else {
print("活体检测未通过,可能是照片或视频");
}
} catch (e) {
print("活体检测失败: $e");
}
}
5. 处理检测结果
startLivenessDetection
方法返回一个 LivenessResult
对象,其中包含以下属性:
isLive
: 布尔值,表示检测到的人脸是否为真实人脸。image
: 检测过程中捕获的人脸图像(如果有的话)。
你可以根据 isLive
的值来决定下一步的操作。
6. 处理异常
在检测过程中可能会抛出异常,例如摄像头权限被拒绝、设备不支持等。你可以通过 try-catch
块来捕获并处理这些异常。
7. 权限处理
确保你的应用已经请求了必要的权限(如相机权限)。你可以在 AndroidManifest.xml
和 Info.plist
中添加相应的权限声明。
Android:
<uses-permission android:name="android.permission.CAMERA" />
iOS:
<key>NSCameraUsageDescription</key>
<string>We need access to your camera for face liveness detection</string>
8. 示例代码
以下是一个完整的示例代码,展示了如何使用 passive_face_liveness
插件进行人脸活体检测:
import 'package:flutter/material.dart';
import 'package:passive_face_liveness/passive_face_liveness.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: LivenessDetectionScreen(),
);
}
}
class LivenessDetectionScreen extends StatefulWidget {
[@override](/user/override)
_LivenessDetectionScreenState createState() => _LivenessDetectionScreenState();
}
class _LivenessDetectionScreenState extends State<LivenessDetectionScreen> {
String _result = '未检测';
[@override](/user/override)
void initState() {
super.initState();
initializePlugin();
}
void initializePlugin() async {
await PassiveFaceLiveness.initialize();
}
void startLivenessDetection() async {
try {
final result = await PassiveFaceLiveness.startLivenessDetection();
setState(() {
_result = result.isLive ? "活体检测通过" : "活体检测未通过";
});
} catch (e) {
setState(() {
_result = "活体检测失败: $e";
});
}
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('人脸活体检测'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('检测结果: $_result'),
SizedBox(height: 20),
ElevatedButton(
onPressed: startLivenessDetection,
child: Text('开始检测'),
),
],
),
),
);
}
}