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设置
- 使用命令安装
git-lfs
- 运行
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
更多关于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),
],
),
),
);
}
}
代码解释
-
导入插件: 使用
import 'package:flutter_accurascan_mrz/flutter_accurascan_mrz.dart';
导入插件。 -
扫描 MRZ: 在
_scanMRZ
方法中,调用FlutterAccurascanMrz.scanMRZ()
来启动 MRZ 扫描。该方法返回一个包含 MRZ 数据的字符串。 -
显示结果: 扫描结果将显示在屏幕上。
注意事项
- 确保你的设备支持相机功能,并且应用已经获取了相机权限。
- 插件的具体实现可能会因版本不同而有所变化,请参考插件的官方文档或示例代码以获取最新信息。
处理权限
在 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 {
// 权限被拒绝
}
}