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
更多关于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应用中,你可以按照以下步骤来使用这个插件:
- 导入插件:
在你的Dart文件中(比如main.dart
),导入插件:
import 'package:oiti_liveness3d/oiti_liveness3d.dart';
- 配置权限:
由于活体检测通常需要使用相机,你需要在AndroidManifest.xml
和Info.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>
- 实现活体认证逻辑:
在你的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细节。
此外,由于活体认证可能涉及用户的敏感信息,确保在你的应用中妥善处理隐私和安全问题。