Flutter人脸活体检测插件passive_face_liveness的使用

发布于 1周前 作者 eggper 来自 Flutter

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。它可能是PassiveFaceLivenessSuccessPassiveFaceLivenessFailurePassiveFaceLivenessClosed的实例。

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

1 回复

更多关于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.xmlInfo.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('开始检测'),
            ),
          ],
        ),
      ),
    );
  }
}
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!