Flutter活体检测插件caf_face_liveness的使用

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

Flutter活体检测插件caf_face_liveness的使用

FaceLiveness SDK 将尖端的面部验证和指纹认证技术引入到您的 Flutter 应用程序中,为用户提供了一种无缝且安全的身份验证方式。

文档

查看我们为该 SDK 插件提供的专用文档页面。详情请参见 Caf 的官方文档

要求

Flutter

Flutter 版本
Flutter 1.20+
Dart >=2.15.0 <4.0.0

Android

Android 版本
minSdk 21
compileSdk 34

iOS

iOS 版本
iOS Target 13.0+
Xcode 15.4+
Swift 5.3.2+

示例代码

以下是 caf_face_liveness 插件的基本使用示例:

import 'package:bmprogresshud/bmprogresshud.dart';
import 'package:caf_face_liveness/face_liveness.dart';
import 'package:caf_face_liveness/face_liveness_enums.dart';
import 'package:caf_face_liveness/face_liveness_events.dart';
import 'package:caf_face_liveness/reverse_proxy_settings.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  var _scanInProgress = false;

  String _result = "";
  String _description = "";

  String mobileToken = "";
  String personId = "";

  var personIdController = TextEditingController();
  var mobileTokenController = TextEditingController();
  bool isBeta = true;

  [@override](/user/override)
  void initState() {
    super.initState();
  }

  void startFaceLiveness() {
    personId = personIdController.text;
    mobileToken = mobileTokenController.text;

    setState(() {
      _scanInProgress = true;
      _result = "";
      _description = "";
    });

    ProgressHud.show(ProgressHudType.loading, 'Launching SDK');

    FaceLiveness faceLiveness =
        FaceLiveness(mobileToken: mobileToken, personId: personId);

    faceLiveness.setStage(isBeta ? CafStage.beta : CafStage.prod);
    faceLiveness.setCameraFilter(CameraFilter.natural);
    faceLiveness.setEnableScreenshots(true);
    faceLiveness.setEnableLoadingScreen(false);

    // 设置其他参数

    final stream = faceLiveness.start();

    stream.listen((event) {
      if (event.isFinal) {
        setState(() => _scanInProgress = false);
      }

      if (event is FaceLivenessEventConnecting) {
        ProgressHud.show(ProgressHudType.loading, 'Loading...');
      } else if (event is FaceLivenessEventConnected) {
        ProgressHud.dismiss();
      } else if (event is FaceLivenessEventClosed) {
        ProgressHud.dismiss();
        setState(() {
          _result = 'Canceled';
          _description = '用户关闭了 SDK';
        });
      } else if (event is FaceLivenessEventSuccess) {
        ProgressHud.showAndDismiss(ProgressHudType.success, 'Success!');
        setState(() {
          _result = 'Success!';
          _description = '\nSignedResponse: ${event.signedResponse}';
        });
        print(
            'SDK 完成成功!\nSignedResponse: ${event.signedResponse}');
      } else if (event is FaceLivenessEventFailure) {
        ProgressHud.showAndDismiss(ProgressHudType.error, event.errorType!);
        setState(() {
          _result = 'Failure!';
          _description = personId.isEmpty
              ? '\n错误类型: ${event.errorType} \n错误信息: personId 是空的'
              : '\n错误类型: ${event.errorType} \n错误信息: ${event.errorDescription}';
        });
        print(
            'SDK 完成失败!\n错误类型: ${event.errorType} \n错误信息: ${event.errorDescription}');
      }
    });

    if (!mounted) return;
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
        home: Scaffold(
            appBar: AppBar(
              title: const Text('FaceLiveness Demo'),
            ),
            body: ProgressHud(
                isGlobalHud: true,
                child: Container(
                    margin: const EdgeInsets.all(20.0),
                    child: Column(
                      children: [
                        Row(
                          children: [
                            Expanded(
                              child: TextField(
                                controller: mobileTokenController,
                                decoration: const InputDecoration(
                                  border: OutlineInputBorder(),
                                  labelText: '在这里输入 mobileToken',
                                ),
                              ),
                            )
                          ],
                        ),
                        const SizedBox(height: 10.0),
                        Row(
                          children: [
                            Expanded(
                              child: TextField(
                                controller: personIdController,
                                decoration: const InputDecoration(
                                  border: OutlineInputBorder(),
                                  labelText: '在这里输入您的ID/CPF',
                                ),
                              ),
                            )
                          ],
                        ),
                        Row(
                          children: [
                            Expanded(
                              child: SwitchListTile(
                                  title: const Text('Beta'),
                                  value: isBeta,
                                  onChanged: (bool value) {
                                    setState(() {
                                      isBeta = value;
                                    });
                                  }),
                            )
                          ],
                        ),
                        Row(
                          children: [
                            ElevatedButton(
                              onPressed: _scanInProgress
                                  ? null
                                  : () {
                                      startFaceLiveness();
                                    },
                              child: const Text('开始面部验证'),
                            )
                          ],
                        ),
                        Row(
                          children: [
                            Container(
                                margin: const EdgeInsets.only(top: 10.0),
                                child: Text("结果: $_result"))
                          ],
                        ),
                        Row(
                          mainAxisAlignment: MainAxisAlignment.spaceBetween,
                          children: [
                            Expanded(
                              child: Text("描述:\n$_description",
                                  maxLines: 15,
                                  overflow: TextOverflow.ellipsis),
                            )
                          ],
                        ),
                      ],
                    )))));
  }
}

更多关于Flutter活体检测插件caf_face_liveness的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter活体检测插件caf_face_liveness的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中集成和使用caf_face_liveness插件进行活体检测的示例代码。caf_face_liveness插件通常用于在应用中实现人脸识别和活体检测功能,确保用户是真实的人而不是照片或视频。

步骤 1: 添加依赖

首先,在你的Flutter项目的pubspec.yaml文件中添加caf_face_liveness依赖:

dependencies:
  flutter:
    sdk: flutter
  caf_face_liveness: ^最新版本号  # 请替换为实际最新版本号

然后运行flutter pub get来安装依赖。

步骤 2: 配置Android权限

由于活体检测通常涉及相机访问,你需要在android/app/src/main/AndroidManifest.xml中添加相机权限:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.yourapp">

    <uses-permission android:name="android.permission.CAMERA" />
    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.camera.autofocus" />

    <!-- 其他配置 -->

</manifest>

步骤 3: 实现活体检测功能

在你的Dart代码中,你可以按照以下方式使用caf_face_liveness插件:

import 'package:flutter/material.dart';
import 'package:caf_face_liveness/caf_face_liveness.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final FaceLiveness _faceLiveness = FaceLiveness();
  bool _isDetecting = false;
  bool _isLive = false;

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('活体检测示例'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text(
                _isDetecting ? '检测中...' : '点击开始检测',
                style: TextStyle(fontSize: 24),
              ),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: _startDetection,
                child: Text('开始检测'),
              ),
              SizedBox(height: 20),
              Text(
                _isLive ? '活体' : '非活体',
                style: TextStyle(fontSize: 24, color: _isLive ? Colors.green : Colors.red),
              ),
            ],
          ),
        ),
      ),
    );
  }

  Future<void> _startDetection() async {
    setState(() {
      _isDetecting = true;
      _isLive = false;
    });

    try {
      final result = await _faceLiveness.startDetection(
        resultCallback: (LiveResult result) {
          setState(() {
            _isDetecting = false;
            _isLive = result.isLive;
          });
        },
        errorCallback: (String error) {
          setState(() {
            _isDetecting = false;
            print('Error: $error');
          });
        },
      );

      // 如果需要,可以在这里处理result,但回调中通常已经处理
    } catch (e) {
      setState(() {
        _isDetecting = false;
        print('Exception: $e');
      });
    }
  }
}

注意事项

  1. 权限请求:在实际应用中,你需要请求用户授予相机权限。这可以通过permission_handler等插件来实现。
  2. UI优化:上述代码仅用于演示,实际项目中你可能需要更复杂的UI和错误处理逻辑。
  3. 插件版本:确保你使用的是caf_face_liveness插件的最新稳定版本,并查阅其官方文档以获取最新和最准确的使用指南。

这样,你就可以在Flutter应用中集成并使用caf_face_liveness插件进行活体检测了。

回到顶部