Flutter文档扫描插件document_scanner的使用

发布于 1周前 作者 yibo5220 来自 Flutter

Flutter文档扫描插件 document_scanner 的使用

document_scanner 是一个为 Flutter 应用添加文档扫描功能的平台视图插件,支持 Android 和 iOS 平台。

警告

当前,文档扫描器的自定义选项可能无法正常工作。

设置

处理相机访问权限

iOS

  1. 在应用的 Info.plist 文件中添加布尔类型的属性,键名为 io.flutter.embedded_views_preview,值为 true,以启用嵌入式视图预览。
    <key>io.flutter.embedded_views_preview</key>
    <true/>
    
  2. 同样在 Info.plist 文件中添加字符串类型的属性,键名为 NSCameraUsageDescription,值为描述应用需要相机权限的原因。
    <key>NSCameraUsageDescription</key>
    <string>Camera Permission Description</string>
    

Android

确保 minSdkVersion 至少为 19。

如何使用?

首先,在 pubspec.yaml 中添加依赖:

dependencies:
  document_scanner: ^latest_version

然后导入包并使用它作为小部件:

import 'package:document_scanner/document_scanner.dart';

// 示例代码片段
File scannedDocument;

DocumentScanner(
    onDocumentScanned: (ScannedImage scannedImage) {
        print("document : " + scannedImage.croppedImage);
        scannedDocument = scannedImage.getScannedDocumentAsFile();
    },
)

完整示例 Demo

以下是一个完整的示例代码,展示了如何集成和使用 document_scanner 插件。该示例还包括了对相机权限的处理。

import 'dart:io';
import 'package:flutter/material.dart';
import 'package:document_scanner/document_scanner.dart';
import 'package:permission_handler/permission_handler.dart';

void main() => runApp(MyApp());

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  File? scannedDocument;
  Future<PermissionStatus>? cameraPermissionFuture;

  @override
  void initState() {
    cameraPermissionFuture = Permission.camera.request();
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
          appBar: AppBar(
            title: const Text('Plugin example app'),
          ),
          body: FutureBuilder<PermissionStatus>(
            future: cameraPermissionFuture,
            builder: (BuildContext context, AsyncSnapshot<PermissionStatus> snapshot) {
              if (snapshot.connectionState == ConnectionState.done) {
                if (snapshot.data!.isGranted)
                  return Stack(
                    children: <Widget>[
                      Column(
                        children: <Widget>[
                          Expanded(
                            child: scannedDocument != null
                                ? Image(image: FileImage(scannedDocument!))
                                : DocumentScanner(
                                    noGrayScale: true,
                                    onDocumentScanned: (ScannedImage scannedImage) {
                                      print("document : " + scannedImage.croppedImage!);
                                      setState(() {
                                        scannedDocument = scannedImage.getScannedDocumentAsFile();
                                      });
                                    },
                                  ),
                          ),
                        ],
                      ),
                      scannedDocument != null
                          ? Positioned(
                              bottom: 20,
                              left: 0,
                              right: 0,
                              child: RaisedButton(
                                  child: Text("retry"),
                                  onPressed: () {
                                    setState(() {
                                      scannedDocument = null;
                                    });
                                  }),
                            )
                          : Container(),
                    ],
                  );
                else
                  return Center(
                    child: Text("camera permission denied"),
                  );
              } else {
                return Center(
                  child: CircularProgressIndicator(),
                );
              }
            },
          )),
    );
  }
}

以上就是关于 document_scanner 插件的基本介绍及使用方法。希望对你有所帮助!


更多关于Flutter文档扫描插件document_scanner的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter文档扫描插件document_scanner的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中集成和使用document_scanner插件的详细步骤和相关代码示例。这个插件允许你实现文档扫描功能,并可以获取扫描后的图像。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  document_scanner: ^0.10.0  # 请注意版本号,使用最新版本

然后运行flutter pub get来安装依赖。

2. 配置权限

由于文档扫描功能需要访问相机和存储设备,你需要在AndroidManifest.xmlInfo.plist中配置相应的权限。

Android (AndroidManifest.xml)

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.yourapp">

    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

    <!-- 其他配置 -->

</manifest>

iOS (Info.plist)

Info.plist中添加以下键和值:

<key>NSCameraUsageDescription</key>
<string>App需要访问相机以扫描文档</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>App需要访问照片库以保存文档扫描结果</string>
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

3. 使用document_scanner插件

在你的Flutter项目中,你可以使用以下代码来启动文档扫描器并获取扫描结果。

示例代码

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: ScanDocumentScreen(),
    );
  }
}

class ScanDocumentScreen extends StatefulWidget {
  @override
  _ScanDocumentScreenState createState() => _ScanDocumentScreenState();
}

class _ScanDocumentScreenState extends State<ScanDocumentScreen> {
  String? scannedImagePath;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Document Scanner'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            scannedImagePath == null
                ? Text('No scanned document available.')
                : Image.file(
                    File(scannedImagePath!),
                    fit: BoxFit.cover,
                    width: 300,
                    height: 400,
                  ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () async {
                try {
                  final result = await DocumentScanner.scanDocument(
                    quality: ScanQuality.high, // or ScanQuality.medium, ScanQuality.low
                    showFlashes: true,
                    beep: true,
                    autoCapture: true,
                    delayAutoCapture: 3000,
                  );

                  if (result.path != null) {
                    setState(() {
                      scannedImagePath = result.path;
                    });
                  } else {
                    // Handle the case where scanning was cancelled or failed
                    print('Scanning failed or cancelled');
                  }
                } catch (e) {
                  print('Error scanning document: $e');
                }
              },
              child: Text('Scan Document'),
            ),
          ],
        ),
      ),
    );
  }
}

4. 运行项目

确保你的开发环境已经配置好,并且连接了设备或启动了模拟器。然后运行flutter run来启动你的Flutter应用。

注意事项

  • 在真实设备上测试时,确保设备上的相机和存储权限已经授予。
  • 你可以根据需求调整DocumentScanner.scanDocument方法的参数,例如扫描质量、是否显示闪光灯、是否发出蜂鸣声等。

这个示例展示了如何在Flutter中使用document_scanner插件进行文档扫描,并显示扫描后的图像。希望这对你有所帮助!

回到顶部