Flutter机读区(MRZ)扫描插件flutter_accurascan_mrz的使用

Flutter机读区(MRZ)扫描插件flutter_accurascan_mrz的使用

Accura Scan OCR用于光学字符识别。

Accura Scan Face Match用于匹配两张人脸,源脸和目标脸。它将自拍与证件上的用户图像进行匹配。

Accura Scan Authentication用于客户验证和身份验证。通过3D自拍技术解锁用户的真正身份。

以下步骤用于在项目中设置Accura Scan的SDK。

注意事项

pubspec.yaml文件中添加flutter_accurascan_mrz依赖项。

dependencies:
  flutter_accurascan_mrz: ^版本号

导入flutter库到文件中。

import 'package:flutter_accurascan_mrz/flutter_accurascan_mrz.dart';

1. 安卓设置

在Android的AndroidManifest.xml文件中添加以下权限:

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

在根build.gradle文件末尾的仓库中添加:

allprojects {
   repositories {
       google()
       jcenter()
       maven {
           url 'https://jitpack.io'
           credentials { username 'jp_ssguccab6c5ge2l4jitaj92ek2' }
       }    
    }
}

app/build.gradle文件中添加:

packagingOptions {
   pickFirst 'lib/arm64-v8a/libcrypto.so'
   pickFirst 'lib/arm64-v8a/libssl.so'
   
   pickFirst 'lib/armeabi-v7a/libcrypto.so'
   pickFirst 'lib/armeabi-v7a/libssl.so'
   
   pickFirst 'lib/x86/libcrypto.so'
   pickFirst 'lib/x86/libssl.so'
   
   pickFirst 'lib/x86_64/libcrypto.so'
   pickFirst 'lib/x86_64/libssl.so'
}

2. iOS设置

  1. 使用命令安装git-lfs
  2. 运行pod install

在iOS的Info.plist文件中添加以下权限:

<key>NSCameraUsageDescription</key>
<string>应用使用相机来扫描文档。</string>

3. 设置Accura Scan许可证到你的项目

Accura Scan有两个许可证需要使用其完整功能。从这里生成自己的Accura许可证。

对于安卓

app/src/main目录下创建一个名为assets的文件夹,并将许可证文件添加到该文件夹中。

- key.license // for Accura Scan OCR

从https://accurascan.com/developer/dashboard生成你的Accura Scan许可证。

对于iOS

key.license放在项目的Runner目录中,并将其添加到目标中。

4. 从SDK获取许可证配置

这会返回你许可证的所有活动功能。

设置许可证

Future<void> getMetaData() async{
  try {
    await AccuraOcr.getMetaData().then((value) =>
        setupConfigData(json.decode(value)));
  }on PlatformException{}
  if (!mounted) return;
}

错误: 字符串

成功: JSON字符串响应 = {

isValid: 布尔值,

isMRZEnable: 布尔值

}

设置配置、错误消息和扫描标题消息

Future<void> setAccuraConfig() async{
  try {
    await AccuraOcr.setFaceBlurPercentage(80);
    await AccuraOcr.setHologramDetection(true);
    await AccuraOcr.setLowLightTolerance(10);
    await AccuraOcr.setMotionThreshold(25);
    await AccuraOcr.setMinGlarePercentage(6);
    await AccuraOcr.setMaxGlarePercentage(99);
    await AccuraOcr.setBlurPercentage(60);
    await AccuraOcr.setCameraFacing(0);
    await AccuraOcr.isCheckPhotoCopy(false);

    await AccuraOcr.SCAN_TITLE_MRZ_PDF417_FRONT("Scan Front Side of Document");
    await AccuraOcr.SCAN_TITLE_MRZ_PDF417_BACK("Scan Back Side of Document");

    await AccuraOcr.ACCURA_ERROR_CODE_MOTION("Keep Document Steady");
    await AccuraOcr.ACCURA_ERROR_CODE_DOCUMENT_IN_FRAME("Keep document in frame");
    await AccuraOcr.ACCURA_ERROR_CODE_BRING_DOCUMENT_IN_FRAME("Bring card near to frame");
    await AccuraOcr.ACCURA_ERROR_CODE_PROCESSING("Processing");
    await AccuraOcr.ACCURA_ERROR_CODE_BLUR_DOCUMENT("Blur detect in document");
    await AccuraOcr.ACCURA_ERROR_CODE_FACE_BLUR("Blur detected over face");
    await AccuraOcr.ACCURA_ERROR_CODE_GLARE_DOCUMENT("Glare detect in document");
    await AccuraOcr.ACCURA_ERROR_CODE_HOLOGRAM("Hologram Detected");
    await AccuraOcr.ACCURA_ERROR_CODE_DARK_DOCUMENT("Low lighting detected");
    await AccuraOcr.ACCURA_ERROR_CODE_PHOTO_COPY_DOCUMENT("Can not accept Photo Copy Document");
    await AccuraOcr.ACCURA_ERROR_CODE_FACE("Face not detected");
    await AccuraOcr.ACCURA_ERROR_CODE_MRZ("MRZ not detected");
    await AccuraOcr.ACCURA_ERROR_CODE_PASSPORT_MRZ("Passport MRZ not detected");
    await AccuraOcr.ACCURA_ERROR_CODE_ID_MRZ("ID MRZ not detected");
    await AccuraOcr.ACCURA_ERROR_CODE_VISA_MRZ("Visa MRZ not detected");
    await AccuraOcr.ACCURA_ERROR_CODE_UPSIDE_DOWN_SIDE("Document is upside down. Place it properly");
    await AccuraOcr.ACCURA_ERROR_CODE_WRONG_SIDE("Scanning wrong side of Document");
    await AccuraOcr.enableLogs(0);
    await AccuraOcr.isShowLogo(1);
    await AccuraOcr.isFlipImg(1);

    await AccuraOcr.CameraScreen_Color("#80000000");   //Pass empty string for clear color else pass the Hex code e.g, #FFFFFF.
    await AccuraOcr.CameraScreen_Back_Button(1); //For iOS disable the back button by Passing 0.
    await AccuraOcr.CameraScreen_Change_Button(1); //To disable flip camera button pass 0.
    await AccuraOcr.CameraScreen_Frame_Color("#D5323F"); //Pass a Hex Code to change the color of the frame.
    await AccuraOcr.CameraScreen_Text_Border_Color("#000000"); //Pass a Hex Code to change the color of the text border pass empty string to disable it.
    await AccuraOcr.CameraScreen_Text_Color("#FFFFFF"); //Pass a Hex Code to change the color of the text.

    await AccuraOcr.setAccuraConfigs();

  }on PlatformException{}
}

5. 扫描MRZ文档的方法

Future<void> startMRZ() async {
  try {
    var config = [
      {"enableLogs": false},
      mrzselected,
    ];
    print('startMRZ:- $config');
    await AccuraOcr.startMRZ(config)
        .then((value) => {
      setState((){
        dynamic result = json.decode(value);
        ResultScreen.Orientation = orientation;
        ResultScreen.result = result;
        print("RESULT:- $result");
      })
    }).onError((error, stackTrace) => {
      setState(() {
      })
    });
  } on PlatformException {}
}

MRZType: 字符串

值: other_mrz 或 passport_mrz 或 id_mrz 或 visa_mrz

成功: JSON响应 = {

front_data: JSON对象,

back_data: JSON对象,

type: 识别类型,

face: URI,

front_img: URI,

back_img: URI

}

错误: 字符串

示例代码

import 'dart:convert';
import 'package:flutter/material.dart';
import 'dart:async';
import 'package:flutter/services.dart';
import 'package:flutter_accurascan_mrz/flutter_accurascan_mrz.dart';
import 'package:flutter_accurascan_mrz_example/ResultScreen.dart';

void main() {
  runApp(MaterialApp(
    home: MyApp(),
    debugShowCheckedModeBanner: false,
  ));
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});
  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  dynamic _result = {"isValid",false};
  String mfile = "";
  Map<String,dynamic> countrySelected = {};
  String mrzCountryList = 'all';
  bool isMRZEnable = false;
  bool isBarcodeEnable = false;
  bool isBankCardEnable = false;
  List barcodeList = [];
  var count = 0;
  String orientation = 'portrait';
  List<Map<String, dynamic>> mrzList = [
    {"label": "Passport", "value": "passport_mrz"},
    {"label": "Mrz ID", "value": "id_mrz"},
    {"label": "Visa Card", "value": "visa_mrz"},
    {"label": "Other", "value": "other_mrz"}
  ];

  List<String> listOfMrz = [''];
  String mrzselected = '';
  dynamic sdkConfig;

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

  Future<void> getMetaData() async{
    try {
      await AccuraOcr.getMetaData().then((value) =>
          setupConfigData(json.decode(value)));
    }on PlatformException{}
    if (!mounted) return;
  }

  Future<void> setAccuraConfig() async{
    try {
      await AccuraOcr.setFaceBlurPercentage(80);
      await AccuraOcr.setHologramDetection(true);
      await AccuraOcr.setLowLightTolerance(10);
      await AccuraOcr.setMotionThreshold(25);
      await AccuraOcr.setMinGlarePercentage(6);
      await AccuraOcr.setMaxGlarePercentage(99);
      await AccuraOcr.setBlurPercentage(60);
      await AccuraOcr.setCameraFacing(0);
      await AccuraOcr.isCheckPhotoCopy(false);

      await AccuraOcr.SCAN_TITLE_MRZ_PDF417_FRONT("Scan Front Side of Document");
      await AccuraOcr.SCAN_TITLE_MRZ_PDF417_BACK("Scan Back Side of Document");

      await AccuraOcr.ACCURA_ERROR_CODE_MOTION("Keep Document Steady");
      await AccuraOcr.ACCURA_ERROR_CODE_DOCUMENT_IN_FRAME("Keep document in frame");
      await AccuraOcr.ACCURA_ERROR_CODE_BRING_DOCUMENT_IN_FRAME("Bring card near to frame");
      await AccuraOcr.ACCURA_ERROR_CODE_PROCESSING("Processing");
      await AccuraOcr.ACCURA_ERROR_CODE_BLUR_DOCUMENT("Blur detect in document");
      await AccuraOcr.ACCURA_ERROR_CODE_FACE_BLUR("Blur detected over face");
      await AccuraOcr.ACCURA_ERROR_CODE_GLARE_DOCUMENT("Glare detect in document");
      await AccuraOcr.ACCURA_ERROR_CODE_HOLOGRAM("Hologram Detected");
      await AccuraOcr.ACCURA_ERROR_CODE_DARK_DOCUMENT("Low lighting detected");
      await AccuraOcr.ACCURA_ERROR_CODE_PHOTO_COPY_DOCUMENT("Can not accept Photo Copy Document");
      await AccuraOcr.ACCURA_ERROR_CODE_FACE("Face not detected");
      await AccuraOcr.ACCURA_ERROR_CODE_MRZ("MRZ not detected");
      await AccuraOcr.ACCURA_ERROR_CODE_PASSPORT_MRZ("Passport MRZ not detected");
      await AccuraOcr.ACCURA_ERROR_CODE_ID_MRZ("ID MRZ not detected");
      await AccuraOcr.ACCURA_ERROR_CODE_VISA_MRZ("Visa MRZ not detected");
      await AccuraOcr.ACCURA_ERROR_CODE_UPSIDE_DOWN_SIDE("Document is upside down. Place it properly");
      await AccuraOcr.ACCURA_ERROR_CODE_WRONG_SIDE("Scanning wrong side of Document");
      await AccuraOcr.enableLogs(0);
      await AccuraOcr.isShowLogo(1);
      await AccuraOcr.isFlipImg(1);

      await AccuraOcr.CameraScreen_Color("#80000000");   //Pass empty string for clear color else pass the Hex code e.g, #FFFFFF.
      await AccuraOcr.CameraScreen_Back_Button(1); //For iOS disable the back button by Passing 0.
      await AccuraOcr.CameraScreen_Change_Button(1); //To disable flip camera button pass 0.
      await AccuraOcr.CameraScreen_Frame_Color("#D5323F"); //Pass a Hex Code to change the color of the frame.
      await AccuraOcr.CameraScreen_Text_Border_Color("#000000"); //Pass a Hex Code to change the color of the text border pass empty string to disable it.
      await AccuraOcr.CameraScreen_Text_Color("#FFFFFF"); //Pass a Hex Code to change the color of the text.

      await AccuraOcr.setAccuraConfigs();

    }on PlatformException{}
  }

  void setupConfigData(obj){
    setState((){
      sdkConfig = obj;
    });
    if(sdkConfig["isValid"] == true){
      setAccuraConfig();
      List<String> tempList3=[];
      if(sdkConfig['isMRZEnable']) {
        for (var item in mrzList) {
          tempList3.add(item['label']);
        }
      }
      setState((){
        listOfMrz = tempList3;
      });
    }
  }

  Future<void> startMRZ() async {
    try {
      var config = [
        {"enableLogs": false},
        mrzselected,
      ];
      print('startMRZ:- $config');
      await AccuraOcr.startMRZ(config)
          .then((value) => {
        setState((){
          _result = json.decode(value);
          ResultScreen.Orientation = orientation;
          ResultScreen.result = _result;
          print("RESULT:- $_result");
        })
      }).onError((error, stackTrace) => {
        setState(() {
        })
      });
    } on PlatformException {}
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text("Accura MRZ"),
          actions: [TextButton(onPressed: (){
            count = count + 1;
            if(count%2 != 0){
              SystemChrome.setPreferredOrientations([DeviceOrientation.landscapeLeft]);
              orientation = "landscape";
            }
            else{
              SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
              orientation = "portrait";
            }
          }, child: count%2 == 0?Text("Landscape",style: TextStyle(color: Colors.white),)
              :Text("Portrait",style: TextStyle(color: Colors.white),))],
          backgroundColor: Colors.red[800],
        ),
        resizeToAvoidBottomInset: true,
        body: SafeArea(child: Container(
          decoration: const BoxDecoration(
            image: DecorationImage(
                image: AssetImage("assets/images/background.png"),
                fit: BoxFit.cover
            ),
          ),
          child:
          SingleChildScrollView(
            child: Center(
              child: Container(
                child:
                sdkConfig == null
                    ? Center(child: CircularProgressIndicator())
                    : !sdkConfig["isValid"]
                    ?
                Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: [
                    Image.asset('assets/images/license.png',height: 150,width: 150,),
                    Text("License is not Valid",textAlign: TextAlign.center,)
                  ],
                ) :
                ListView.builder(
                    shrinkWrap: true,
                    physics: NeverScrollableScrollPhysics(),
                    scrollDirection: Axis.vertical,
                    itemCount: listOfMrz.length,
                    itemBuilder: (context,index){
                      return
                        SingleChildScrollView(
                            child:
                            Card(
                                color: Colors.grey,
                                child:
                                ListTile(
                                  title: Text(listOfMrz[index]
                                    ,style: TextStyle(fontSize: 20,fontWeight: FontWeight.bold,color: Colors.white),
                                  ),
                                  onTap: () async{
                                    if(listOfMrz[index] == 'Passport'){
                                      mrzselected = 'passport_mrz';
                                      print('passport');
                                      await startMRZ();
                                      Navigator.push(
                                          context,
                                          MaterialPageRoute(
                                              builder: (context) => ResultScreen()));
                                    }
                                    else if(listOfMrz[index] == 'Visa Card'){
                                      mrzselected = 'visa_card';
                                      print('visa_card');
                                      await startMRZ();
                                      Navigator.push(
                                          context,
                                          MaterialPageRoute(
                                              builder: (context) => ResultScreen()));
                                    }
                                    else if(listOfMrz[index] == 'Mrz ID'){
                                      mrzselected = 'id_mrz';
                                      print('ID');
                                      await startMRZ();
                                      Navigator.push(
                                          context,
                                          MaterialPageRoute(
                                              builder: (context) => ResultScreen()));
                                    } else {
                                      mrzselected = 'other_mrz';
                                      print('other_mrz');
                                      await startMRZ();
                                      Navigator.push(
                                          context,
                                          MaterialPageRoute(
                                              builder: (context) => ResultScreen()));
                                    }
                                  },
                                )
                            )
                        );
                    }),
              ),
            )
          ),
        ),
        )
      )
    );
  }
}

更多关于Flutter机读区(MRZ)扫描插件flutter_accurascan_mrz的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter机读区(MRZ)扫描插件flutter_accurascan_mrz的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


flutter_accurascan_mrz 是一个用于在 Flutter 应用中扫描机读区(MRZ)的插件。MRZ 通常出现在护照、身份证等证件上,包含持证人的关键信息。该插件可以帮助你快速集成 MRZ 扫描功能到你的应用中。

安装插件

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

dependencies:
  flutter:
    sdk: flutter
  flutter_accurascan_mrz: ^1.0.0  # 请使用最新版本

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

使用插件

以下是一个简单的示例,展示如何使用 flutter_accurascan_mrz 插件来扫描 MRZ。

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'MRZ Scanner',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MRZScannerScreen(),
    );
  }
}

class MRZScannerScreen extends StatefulWidget {
  @override
  _MRZScannerScreenState createState() => _MRZScannerScreenState();
}

class _MRZScannerScreenState extends State<MRZScannerScreen> {
  String _mrzData = '';

  Future<void> _scanMRZ() async {
    try {
      final mrzData = await FlutterAccurascanMrz.scanMRZ();
      setState(() {
        _mrzData = mrzData;
      });
    } catch (e) {
      setState(() {
        _mrzData = 'Failed to scan MRZ: $e';
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('MRZ Scanner'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: _scanMRZ,
              child: Text('Scan MRZ'),
            ),
            SizedBox(height: 20),
            Text('MRZ Data:'),
            Text(_mrzData),
          ],
        ),
      ),
    );
  }
}

代码解释

  1. 导入插件: 使用 import 'package:flutter_accurascan_mrz/flutter_accurascan_mrz.dart'; 导入插件。

  2. 扫描 MRZ: 在 _scanMRZ 方法中,调用 FlutterAccurascanMrz.scanMRZ() 来启动 MRZ 扫描。该方法返回一个包含 MRZ 数据的字符串。

  3. 显示结果: 扫描结果将显示在屏幕上。

注意事项

  • 确保你的设备支持相机功能,并且应用已经获取了相机权限。
  • 插件的具体实现可能会因版本不同而有所变化,请参考插件的官方文档或示例代码以获取最新信息。

处理权限

在 Android 和 iOS 上,你需要在应用中请求相机权限。可以使用 permission_handler 插件来处理权限请求。

dependencies:
  permission_handler: ^10.0.0  # 请使用最新版本

然后在代码中请求相机权限:

import 'package:permission_handler/permission_handler.dart';

Future<void> _requestCameraPermission() async {
  final status = await Permission.camera.request();
  if (status.isGranted) {
    // 权限已授予
  } else {
    // 权限被拒绝
  }
}
回到顶部