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

1 回复

更多关于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'),
);
回到顶部