Flutter活体3D认证插件oiti_liveness3d的使用

Flutter活体3D认证插件oiti_liveness3d的使用

在本指南中,我们将探讨如何在Flutter项目中使用Oiti的Liveness 3D插件。此插件允许开发者通过活体检测技术来验证用户的身份。

Oiti - Liveness 3D插件介绍

Oiti的Liveness 3D插件是一种用于实现活体检测的工具,它能够帮助开发者创建安全的应用程序。该插件适用于iOS和Android平台,并且可以通过pub.dev进行安装。

Pub.dev 是Dart语言的软件包管理器,提供了许多可重用的库和包,供Flutter和其他Dart项目使用。

在Flutter中,插件是一种软件包,可以提供对设备原生功能的访问权限,使Flutter应用程序能够与iOS和Android操作系统进行通信,从而添加额外的功能并提升用户体验。这些插件可以用Dart编写,并可能包含Kotlin或Swift等本地语言的代码。

最低要求

平台 最低要求
Android Gradle: 6.8
iOS iOS: 11

概要

以下是一些指导文档的链接,可以帮助你快速集成和使用该插件:

变更日志

有关插件版本更新的信息,可以访问此链接

了解更多


示例代码

以下是使用Oiti Liveness 3D插件的完整示例代码。

import 'package:flutter/material.dart';
import 'package:oiti_liveness3d/common/enumerations.dart';
import 'package:oiti_liveness3d/common/texts_builder.dart';
import 'package:oiti_liveness3d/common/theme_builder.dart';
import 'package:oiti_liveness3d/common/fonts_builder.dart';
import 'package:oiti_liveness3d/common/loading_appearance.dart';
import 'package:oiti_liveness3d/common/liveness_success_result.dart';
import 'package:oiti_liveness3d/oiti_liveness3d.dart';

void main() {
  runApp(const MaterialApp(
    title: 'Navigation Basics',
    home: MyApp(),
  ));
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

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

class _MyAppState extends State<MyApp> {
  late TextEditingController _controller;
  var appKey = 'sdfsdf234234sdfsdfsdf';
  final environment = Environment.hml;

  final acitivityLoading = LoadingAppearence(
    type: LoadingType.activity,
    size: 2,
    backgroundColor: "#FFFFFF",
    loadingColor: "#000000",
  );

  final spinnerLoading = LoadingAppearence(
    type: LoadingType.spinner,
    size: 7,
    backgroundColor: "#000000",
    loadingColor: "#FFFFFF",
  );

  var resultTitle = '';
  var resultContent = '';

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Liveness 3D - Flutter'),
        ),
        body: ListView(
          children: [
            _liveness3DWidgetOption(
              context,
              '默认',
            ),
            _liveness3DWidgetOption(
              context,
              '加载圆圈',
              loading: spinnerLoading,
            ),
            _liveness3DWidgetOption(
              context,
              '活动加载',
              loading: acitivityLoading,
            ),
            _liveness3DWidgetOption(
              context,
              '自定义文本',
              builder: _textsCustomization(),
            ),
            _liveness3DWidgetOption(
              context,
              '自定义主题',
              themeBuilder: _themeCustomization(),
            ),
            _liveness3DWidgetOption(
              context,
              '自定义字体',
              builder: _textsCustomization(),
              fontsBuilder: _fontsCustomization(),
            ),
            _hideInstructionWidgetOption(
              context,
              '跳过活体检测',
              themeBuilder: _themeCustomization(),
            ),
            Padding(
              padding: const EdgeInsets.all(20),
              child: Text(resultContent),
            ),
            Padding(
              padding: const EdgeInsets.all(10),
              child: Text(appKey.isEmpty ? 'AppKey为空' : 'AppKey可用'),
            ),
            appKeySection(),
          ],
        ),
      ),
    );
  }

  hideInstructions(
    BuildContext context,
    String appKey,
    Environment environment,
    ThemeBuilder? themeBuilder,
  ) {
    OitiLiveness3d().checkPermission().then((authorized) => {
          if (authorized)
            {
              OitiLiveness3d()
                  .openLiveness3D(
                    appKey: appKey,
                    themeBuilder: themeBuilder,
                    environment: environment,
                  )
                  .then((result) async => {_onLiveness3DSuccess(result)})
                  .onError(
                      (error, stackTrace) async => {_onLiveness3DError(error)})
                  .catchError((error) async => {_onLiveness3DError(error)})
                  .whenComplete(() => _showAlertDialog(
                        context,
                        resultTitle,
                        resultContent,
                      ))
            }
        });
  }

  Widget _hideInstructionWidgetOption(
    BuildContext context,
    String title, {
    ThemeBuilder? themeBuilder,
  }) {
    return Padding(
      padding: const EdgeInsets.only(left: 20, right: 20, top: 10, bottom: 5),
      child: ElevatedButton(
        style: ElevatedButton.styleFrom(
          minimumSize: const Size.fromHeight(50),
        ),
        onPressed: () => hideInstructions(
          context,
          appKey,
          environment,
          themeBuilder,
        ),
        child: Text(title),
      ),
    );
  }

  Widget _liveness3DWidgetOption(
    BuildContext context,
    String title, {
    TextsBuilder? builder,
    ThemeBuilder? themeBuilder,
    Liveness3dFonts? fontsBuilder,
    LoadingAppearence? loading,
  }) {
    return Padding(
      padding: const EdgeInsets.only(left: 20, right: 20, top: 10, bottom: 5),
      child: ElevatedButton(
        style: ElevatedButton.styleFrom(
          minimumSize: const Size.fromHeight(50),
        ),
        onPressed: () => Navigator.push(
          context,
          MaterialPageRoute(
            builder: (context) => OitiLiveness3d.createLiveness3DWidget(
              appKey: appKey,
              environment: environment,
              textsBuilder: builder,
              themeBuilder: themeBuilder,
              fontsBuilder: fontsBuilder,
              loadingAppearance: loading,
              onSuccess: (result) => _onLiveness3DSuccess(result),
              onError: (error) => _onLiveness3DError(error),
            ),
          ),
        ).whenComplete(
          () => _showAlertDialog(
            context,
            resultTitle,
            resultContent,
          ),
        ),
        child: Text(title),
      ),
    );
  }

  Widget appKeySection() {
    return Padding(
      padding: const EdgeInsets.only(left: 20, right: 20, bottom: 45),
      child: TextField(
        decoration: const InputDecoration(
          border: OutlineInputBorder(),
          labelText: 'App Key',
        ),
        obscureText: false,
        controller: _controller,
        onSubmitted: (value) => _pasteAppKey(),
      ),
    );
  }

  _pasteAppKey() {
    setState(() => appKey = _controller.text);
    _controller.text = '';
  }

  TextsBuilder _textsCustomization() {
    return TextsBuilder()
      ..readyHeader1 = '准备就绪标题1'
      ..readyHeader2 = '准备就绪标题2'
      ..readyMessage1 = '准备就绪消息1'
      ..readyMessage2 = '准备就绪消息2'
      ..readyButton = '准备就绪按钮'
      ..retryHeader = '重试标题'
      ..retrySubheader = '重试副标题'
      ..retryYourPicture = '你的照片'
      ..retryIdealPicture = '理想的照片'
      ..retryMessageSmile = '微笑'
      ..retryMessageLighting = '光线'
      ..retryMessageContrast = '对比度'
      ..retryButton = '重试按钮'
      ..resultUploadMessage = '上传结果消息'
      ..resultSuccessMessage = '成功消息'
      ..feedbackCenterFace = '居中面部'
      ..feedbackFaceNotFound = '未找到面部'
      ..feedbackFaceNotLookingStraightAhead = '面部未直视前方'
      ..feedbackFaceNotUpright = '面部未正立'
      ..feedbackHoldSteady = '保持稳定'
      ..feedbackMovePhoneAway = '远离手机'
      ..feedbackMovePhoneCloser = '靠近手机'
      ..feedbackMovePhoneToEyeLevel = '将手机调整到眼睛水平'
      ..feedbackUseEvenLighting = '使用均匀光线'
      ..feedbackFrameYourFace = '框选面部'
      ..feedbackPositionFaceStraightInOval = '面部正直位于椭圆形内'
      ..feedbackHoldSteady1 = '保持稳定1'
      ..feedbackHoldSteady2 = '保持稳定2'
      ..feedbackHoldSteady3 = '保持稳定3'
      ..feedbackRemoveDarkGlasses = '移除深色眼镜'
      ..feedbackNeutralExpression = '中性表情'
      ..feedbackConditionsTooBright = '环境太亮'
      ..feedbackBrightenYourEnvironment = '增加环境亮度';
  }

  ThemeBuilder _themeCustomization() {
    return ThemeBuilder()
      ..guidanceCustomizationButtonBackgroundNormalColor = '#8e9334'
      ..ovalCustomizationStrokeColor = '#8e9334';
  }

  Liveness3dFonts _fontsCustomization() {
    return Liveness3dFonts()
      ..guidanceCustomizationHeaderFont = 'Lobster'
      ..guidanceCustomizationSubtextFont = 'Lobster'
      ..readyScreenCustomizationHeaderFont = 'Lobster'
      ..guidanceCustomizationButtonFont = 'Lobster'
      ..feedbackCustomizationTextFont = 'Lobster';
  }

  Future<void> _showAlertDialog(
      BuildContext context, String resultType, String content) async {
    return showDialog<void>(
      context: context,
      barrierDismissible: false,
      builder: (BuildContext context) {
        return AlertDialog(
          title: Text('结果: $resultType'),
          content: Text(content),
          actions: <Widget>[
            TextButton(
              child: const Text('确定'),
              onPressed: () => Navigator.of(context).pop(),
            ),
          ],
        );
      },
    );
  }

  /// Liveness 3D 回调
  _onLiveness3DSuccess(LivenessSuccessResult result) {
    resultTitle = '成功';
    resultContent =
        '有效: ${result.valid}\n编码ID: ${result.codId}\n原因: ${result.cause}\n协议: ${result.protocol}\n扫描结果Blob: ${result.scanResultBlob}\n';
  }

  _onLiveness3DError(Object? error) {
    resultTitle = '错误';
    resultContent = '原因: ${error.toString()}';
  }
}

更多关于Flutter活体3D认证插件oiti_liveness3d的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


当然,以下是一个关于如何在Flutter项目中使用oiti_liveness3d插件来进行活体3D认证的示例代码。这个插件主要用于进行面部活体检测,以确保用户是真实存在的,而不是照片或视频欺骗。

首先,你需要在你的pubspec.yaml文件中添加对oiti_liveness3d插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  oiti_liveness3d: ^latest_version  # 请替换为插件的最新版本

然后运行flutter pub get来安装插件。

接下来,在你的Flutter应用中,你可以按照以下步骤来使用这个插件:

  1. 导入插件

在你的Dart文件中(比如main.dart),导入插件:

import 'package:oiti_liveness3d/oiti_liveness3d.dart';
  1. 配置权限

由于活体检测通常需要使用相机,你需要在AndroidManifest.xmlInfo.plist中添加相应的权限配置。对于Android,你需要添加相机权限:

<!-- 在AndroidManifest.xml中添加 -->
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />

对于iOS,你需要在Info.plist中添加相机使用说明:

<!-- 在Info.plist中添加 -->
<key>NSCameraUsageDescription</key>
<string>需要访问相机以进行活体认证</string>
  1. 实现活体认证逻辑

在你的Flutter应用中,你可以创建一个按钮来触发活体认证流程,并处理认证结果。以下是一个简单的示例:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter 活体3D认证示例'),
        ),
        body: Center(
          child: LivenessButton(),
        ),
      ),
    );
  }
}

class LivenessButton extends StatefulWidget {
  @override
  _LivenessButtonState createState() => _LivenessButtonState();
}

class _LivenessButtonState extends State<LivenessButton> {
  final OitiLiveness3d _liveness3d = OitiLiveness3d();

  @override
  Widget build(BuildContext context) {
    return ElevatedButton(
      onPressed: () async {
        try {
          // 启动活体认证
          bool result = await _liveness3d.startLivenessDetection();
          if (result) {
            // 认证成功
            ScaffoldMessenger.of(context).showSnackBar(
              SnackBar(content: Text('活体认证成功!')),
            );
          } else {
            // 认证失败
            ScaffoldMessenger.of(context).showSnackBar(
              SnackBar(content: Text('活体认证失败,请重试。')),
            );
          }
        } catch (e) {
          // 处理异常
          ScaffoldMessenger.of(context).showSnackBar(
            SnackBar(content: Text('发生错误: $e')),
          );
        }
      },
      child: Text('进行活体认证'),
    );
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,其中包含一个按钮。点击按钮将启动活体认证流程,并根据认证结果显示相应的Snackbar消息。

请注意,OitiLiveness3d.startLivenessDetection()方法的具体实现和返回值可能会根据插件的版本和API设计有所不同。因此,请参考插件的官方文档和示例代码来获取最新的使用方法和API细节。

此外,由于活体认证可能涉及用户的敏感信息,确保在你的应用中妥善处理隐私和安全问题。

回到顶部