Flutter文档识别与验证插件acuant_flutter的使用
Flutter文档识别与验证插件acuant_flutter的使用
acuant_flutter
Acuant文档相机和自拍相机插件用于Flutter。
对于iOS
在Podfile中
替换以下内容:
post_install do |installer|
installer.pods_project.targets.each do |target|
flutter_additional_ios_build_settings(target)
end
end
为:
post_install do |installer|
installer.pods_project.targets.each do |target|
if %w[
AcuantiOSSDKV11
Socket.IO-Client-Swift
Starscream
].include? target.name
target.build_configurations.each do |config|
config.build_settings["BUILD_LIBRARY_FOR_DISTRIBUTION"] = "YES"
config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64"
end
else
flutter_additional_ios_build_settings(target)
end
end
end
使用本地化字符串
在XCode中,创建一个Localizable.strings文件,并放入以下内容:
/*
Localizable.strings
Runner
Created by Edward Yuan on 2022-12-12.
*/
/* SampleApp */
"Back Side?" = "背面?";
"Scan the back side of the medical insurance card" = "扫描医疗保险卡的背面";
"Scan the back side of the ID document" = "扫描身份证件的背面";
"Capture Barcode" = "捕捉条形码";
"Barcode Expected" = "预期捕捉到条形码,但未捕捉到。请尝试重新捕捉条形码";
/* AcuantCamera */
"acuant_camera_align" = "对齐";
"acuant_camera_manual_capture" = "对齐并点击";
"acuant_camera_move_closer" = "靠近一点";
"acuant_camera_hold_steady" = "保持稳定";
"acuant_camera_capturing" = "正在捕捉";
"acuant_camera_outside_view" = "太近了!";
"acuant_camera_paused" = "摄像头暂停";
"acuant_camera_capture_barcode" = "捕捉条形码";
/* AcuantFaceCapture/AcuantPassiveLiveness */
"acuant_face_camera_initial" = "对准面部开始捕捉";
"acuant_face_camera_face_too_close" = "太近了!请远离";
"acuant_face_camera_face_too_far" = "靠近一些";
"acuant_face_camera_face_has_angle" = "面部有角度。不要倾斜";
"acuant_face_camera_face_not_in_frame" = "移入画面内";
"acuant_face_camera_face_moved" = "保持稳定";
"acuant_face_camera_capturing_2" = "捕捉\n2...";
"acuant_face_camera_capturing_1" = "捕捉\n1...";
"acuant_face_camera_rotate_portrait" = "只能以肖像模式捕捉面部";
"acuant_face_camera_paused" = "摄像头暂停";
/* AcuantHGLiveness */
"hg_too_close" = "太近了!请远离";
"hg_too_far_away" = "靠近一些";
"hg_move_in_frame" = "移入画面内";
"hg_blink" = "眨眼!";
"hg_hold_steady" = "保持稳定";
"hg_align_face_and_blink" = "对准面部开始";
/* AcuantIPLiveness */
"IProov_LanguageFile" = "en-US";
"IProov_PromptTapToBegin" = "轻触屏幕开始";
"IProov_PromptTooFar" = "靠近一些";
"IProov_PromptTooBright" = "去光线较暗的地方";
"IProov_PromptLivenessScanCompleted" = "扫描完成";
"IProov_PromptGenuinePresenceAlignFace" = "将面部放在椭圆框内";
"IProov_PromptLivenessAlignFace" = "用面部填满椭圆框";
"IProov_PromptLivenessNoTarget" = "将面部放在框架内";
"IProov_ProgressStreaming" = "正在流式传输…";
"IProov_ProgressStreamingSlow" = "正在流式传输,网络较慢…";
"IProov_PromptScanning" = "正在扫描…";
"IProov_ProgressIdentifyingFace" = "识别面部…";
"IProov_ProgressConfirmingIdentity" = "确认身份…";
"IProov_ProgressAssessingGenuinePresence" = "评估真实存在性…";
"IProov_ProgressAssessingLiveness" = "评估活体检测…";
"IProov_ProgressLoading" = "正在加载…";
"IProov_ProgressCreatingIdentity" = "正在创建身份…";
"IProov_ProgressFindingFace" = "正在查找面部…";
"IProov_Authenticate" = "验证";
"IProov_Enrol" = "注册";
"IProov_MessageFormat" = "%@ 到 %@";
"IProov_PromptTooClose" = "太近了";
"IProov_FailureMotionTooMuchMovement" = "请在iProov过程中不要移动";
"IProov_FailureLightingFlashReflectionTooLow" = "环境光太强或屏幕亮度太低";
"IProov_FailureLightingBacklit" = "检测到背后有强光源";
"IProov_FailureLightingTooDark" = "您的环境看起来太暗";
"IProov_FailureLightingFaceTooBright" = "面部检测到太多光线";
"IProov_FailureMotionTooMuchMouthMovement" = "请在iProov过程中不要说话";
"IProov_MessageFormatWithUsername" = "%@ 作为 %@ 到 %@";
"IProov_PromptRollTooHigh" = "避免头部倾斜";
"IProov_PromptRollTooLow" = "避免头部倾斜";
"IProov_PromptYawTooLow" = "稍微向右转一下";
"IProov_PromptYawTooHigh" = "稍微向左转一下";
"IProov_PromptPitchTooHigh" = "将设备保持在眼睛水平";
"IProov_PromptPitchTooLow" = "将设备保持在眼睛水平";
"IProov_ErrorNetwork" = "网络错误";
"IProov_ErrorCameraPermissionDenied" = "相机权限被拒绝";
"IProov_ErrorCameraPermissionDeniedMessageIos" = "请在iOS设置中允许此应用访问相机";
"IProov_ErrorServer" = "服务器错误";
"IProov_ErrorUnexpected" = "意外错误";
"IProov_ErrorCaptureAlreadyActive" = "已有正在进行的捕捉";
"IProov_PromptGetReady" = "准备中…";
"IProov_PromptGrantPermission" = "授予相机访问权限";
"IProov_PromptGrantPermissionMessage" = "使用iProov必须授予相机访问权限";
"IProov_FailureAmbiguousOutcome" = "结果不明确";
完整示例代码
import 'package:acuant_flutter_example/acuant_key.dart';
import 'package:flutter/material.dart';
import 'package:acuant_flutter/acuant_flutter.dart';
import 'package:flutter/services.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
[@override](/user/override)
Widget build(BuildContext context) {
return const MaterialApp(
title: "Test",
home: MyPage(),
);
}
}
class MyPage extends StatefulWidget {
const MyPage({Key? key}) : super(key: key);
[@override](/user/override)
State<MyPage> createState() => _MyPageState();
}
class _MyPageState extends State<MyPage> {
AcuantDocumentImage? acuantDocumentImage;
AcuantFaceImage? acuantFaceImage;
[@override](/user/override)
void initState() {
super.initState();
}
void initAcuant() async {
bool res = await Acuant.instance.initialize(
username: kAcuantUsername,
password: kAcuantPassword,
);
print(res);
}
void showDocumentCamera({bool isBack = false}) async {
setState(() {
acuantDocumentImage = null;
});
try {
final res = await Acuant.instance.showDocumentCamera(isBack: isBack);
print(res);
if (res is AcuantDocumentImage) {
setState(() {
acuantDocumentImage = res;
});
}
} on PlatformException catch (e) {
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: const Text("错误"),
content: Text(e.message ?? "发生错误"),
);
});
} catch (e) {
print(e);
}
}
void showFaceCamera() async {
try {
setState(() {
acuantFaceImage = null;
});
final res = await Acuant.instance.showFaceCamera();
print(res);
if (res is AcuantFaceImage) {
setState(() {
acuantFaceImage = res;
});
}
} on PlatformException catch (e) {
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: const Text("错误"),
content: Text(e.message ?? "发生错误"),
);
});
} catch (e) {
print(e);
}
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('插件示例应用'),
),
body: SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.all(32),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
ElevatedButton(
onPressed: initAcuant,
child: const Text('初始化'),
),
ElevatedButton(
onPressed: showDocumentCamera,
child: const Text('显示文档相机'),
),
ElevatedButton(
onPressed: () => showDocumentCamera(isBack: true),
child: const Text('显示文档相机(背面)'),
),
ElevatedButton(
onPressed: showFaceCamera,
child: const Text('显示面部相机'),
),
if (acuantDocumentImage != null) ...[
Image.memory(acuantDocumentImage!.rawBytes),
Text("宽高比 ${acuantDocumentImage!.aspectRatio}"),
Text("DPI ${acuantDocumentImage!.dpi}"),
Text("眩光 ${acuantDocumentImage!.glare}"),
Text("是否正确宽高比 ${acuantDocumentImage!.isCorrectAspectRatio}"),
Text("是否护照 ${acuantDocumentImage!.isPassport}"),
Text("清晰度 ${acuantDocumentImage!.sharpness}"),
],
if (acuantFaceImage != null) ...[
Image.memory(acuantFaceImage!.rawBytes),
Text("活体检测 ${acuantFaceImage!.liveness}"),
]
],
),
),
),
);
}
}
更多关于Flutter文档识别与验证插件acuant_flutter的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter文档识别与验证插件acuant_flutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
acuant_flutter
是一个用于在 Flutter 应用中实现文档识别与验证功能的插件。它基于 Acuant 的 SDK,提供了捕获、处理和验证身份证、护照、驾照等文档的功能。以下是如何使用 acuant_flutter
插件的基本步骤:
1. 添加依赖
首先,在 pubspec.yaml
文件中添加 acuant_flutter
依赖:
dependencies:
flutter:
sdk: flutter
acuant_flutter: ^latest_version
然后运行 flutter pub get
来安装依赖。
2. 初始化 SDK
在使用 acuant_flutter
之前,需要初始化 Acuant SDK。通常,你需要在应用启动时进行初始化,并确保你拥有有效的凭证(如 License Key)。
import 'package:acuant_flutter/acuant_flutter.dart';
void initializeAcuantSDK() async {
try {
await Acuant.initialize(
licenseKey: 'YOUR_LICENSE_KEY',
endpoint: 'YOUR_ENDPOINT',
);
print('Acuant SDK initialized successfully');
} catch (e) {
print('Failed to initialize Acuant SDK: $e');
}
}
3. 捕获文档
acuant_flutter
提供了捕获文档的功能。你可以使用 Acuant.captureDocument
方法来启动文档捕获流程。
void captureDocument() async {
try {
var document = await Acuant.captureDocument();
print('Document captured: ${document.documentFrontImage}');
// 处理捕获的文档
} catch (e) {
print('Failed to capture document: $e');
}
}
4. 处理与验证文档
捕获文档后,你可以对文档进行处理和验证。例如,提取文档中的信息或进行真实性验证。
void processDocument() async {
try {
var document = await Acuant.captureDocument();
var processedDocument = await Acuant.processDocument(document);
print('Processed document: ${processedDocument.data}');
// 进行进一步的验证或处理
} catch (e) {
print('Failed to process document: $e');
}
}
5. 处理捕获的图像
acuant_flutter
还允许你处理捕获的图像,例如裁剪、增强或提取文本。
void processImage() async {
try {
var image = await Acuant.captureImage();
var processedImage = await Acuant.processImage(image);
print('Processed image: ${processedImage.path}');
// 处理图像
} catch (e) {
print('Failed to process image: $e');
}
}
6. 错误处理
在使用 acuant_flutter
的过程中,可能会遇到各种错误。确保你在代码中妥善处理这些错误,以提供更好的用户体验。
void handleError() async {
try {
var document = await Acuant.captureDocument();
// 处理文档
} on AcuantException catch (e) {
print('AcuantException: ${e.message}');
} catch (e) {
print('Unexpected error: $e');
}
}
7. 释放资源
在应用退出或不再需要 Acuant SDK 时,记得释放资源。
void releaseResources() async {
await Acuant.release();
print('Acuant resources released');
}
8. 权限处理
确保在捕获文档或图像之前,已经获取了必要的权限(如相机权限)。
import 'package:permission_handler/permission_handler.dart';
void requestPermissions() async {
var status = await Permission.camera.request();
if (status.isGranted) {
print('Camera permission granted');
} else {
print('Camera permission denied');
}
}
9. UI 集成
你可以将 acuant_flutter
的功能集成到你的应用中,例如通过按钮启动文档捕获流程,并在 UI 中显示捕获的文档或处理结果。
ElevatedButton(
onPressed: captureDocument,
child: Text('Capture Document'),
);