Skip to content

Latest commit

 

History

History
232 lines (174 loc) · 7.22 KB

README-zh.md

File metadata and controls

232 lines (174 loc) · 7.22 KB

更新

  • 升级v1.2,支持自定义视图

注意

ScanKit iOS SDK不支持armv7,只支持arm64,因此你需要在Xcode中配置, 看这里.


flutter_scankit_plus

中文文档 | English

这是一个扫码的Flutter插件,它是HUAWEI ScanKit SDK的Flutter包。HUAWEI ScanKit 是一个强大的库,使用简单,对于模糊污损码识别率高,识码速度超快。

得益于华为在计算机视觉领域能力的积累,Scan Kit可以实现远距离码或小型码的检测和自动放大,同时针对常见复杂扫码场景(如反光、暗光、污损、模糊、柱面)做了针对性识别优化,提升扫码成功率与用户体验。

  • Android
  • iOS

扫码

Scan Kit支持扫描13种全球主流的码制式。如果您的应用只处理部分特定的码制式,您也可以在接口中指定制式以便加快扫码速度。已支持的码制式:

  • 一维码:EAN-8、EAN-13、UPC-A、UPC-E、Codabar、Code 39、Code 93、Code 128、ITF-14
  • 二维码:QR Code、Data Matrix、PDF417、Aztec

支持相机扫码和本地图片码识别。

简单用法

  1. 配置权限
  2. 处理权限请求
  3. 调用API

配置权限

iOS

将以下内容添加到ios/Runner/Info.plist

    <key>NSCameraUsageDescription</key>
    <string>在此向用户解释你为什么需要这个权限</string>
    <key>NSPhotoLibraryUsageDescription</key>
    <string>在此向用户解释你为什么需要这个权限</string>

注意,替换<string></string>标签的内容,给用户一个需要该权限的理由。

安卓平台不需要配置!

权限请求

在Flutter中,你需要一个插件库来处理权限,这里推荐我的另一个插件库:flutter_easy_permission,详细配置请看 这里

打开ios/Podfile文件,添加如下配置:

target 'Runner' do
  flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
  # Add the library of permissions you need here
  pod 'EasyPermissionX/Camera'
  pod 'EasyPermissionX/Photo'
end

然后执行命令进行安装。

调用API

  void initState() {
    super.initState();
    scanKit = FlutterScankitPlus()
	 ..addResultListen((val) {
	  // 返回识别结果
      debugPrint("scanning result:$val");
    });

    FlutterEasyPermission().addPermissionCallback(
        onGranted: (requestCode, perms,perm) {
          startScan();
        },
        onDenied: (requestCode, perms,perm, isPermanent) {});
  }

Scan the code:

    // 如果没有权限则请求
    if (!await FlutterEasyPermission.has(perms: _permissions,permsGroup: _permissionGroup)) {
          FlutterEasyPermission.request(perms: _permissions,permsGroup: _permissionGroup);
    } else {
          // 有权限则调用
          startScan();
    }
    
    
Future<void> startScan() async {
    try {
      await scanKit.startScan(scanTypes: [ScanTypes.ALL]);
    } on PlatformException {}
}

关于 FlutterEasyPermission的用法,请查看这里

自定义视图

使用ScanKitWidget作为扫码控件,ScanKitController用于闪光灯切换、图片识码等功能

class _CustomizedViewState extends State<CustomizedView> {
  late ScanKitController _controller;

  final screenWidth = window.physicalSize.width;
  final screenHeight = window.physicalSize.height;
  
  @override
  void dispose(){
    _controller.dispose();
   super.dispose(); 
  }

  @override
  Widget build(BuildContext context) {
    var pixelSize = boxSize * window.devicePixelRatio;
    var left = screenWidth/2 - pixelSize/2;
    var top = screenHeight/2 - pixelSize/2;
    var right = screenWidth/2 + pixelSize/2;
    var bottom = screenHeight/2 + pixelSize/2;
    var rect = Rect.fromLTRB(left, top, right, bottom);

    return Scaffold(
      body: SafeArea(
        child: Stack(
          children: [
	   /// 使用 ScanKitWidget 实现扫码,可自定义扫码页面视图
            ScanKitWidget(
                callback: (controller) {
                  _controller = controller;

                  controller.onResult.listen((result) {
                    debugPrint("scanning result:$result");

                    Navigator.of(context).pop(result);
                  });
                },
              continuouslyScan: false,
              boundingBox: rect),
            Align(
              alignment: Alignment.topCenter,
              child: Row(
                mainAxisAlignment: MainAxisAlignment.spaceBetween,
                children: [
                  IconButton(
                      onPressed: () {
                        Navigator.of(context).pop();
                      },
                      icon: Icon(
                        Icons.arrow_back,
                        color: Colors.white,
                        size: 28,
                      )),
                  IconButton(
                      onPressed: () {
                        _controller.switchLight();
                      },
                      icon: Icon(
                        Icons.lightbulb_outline_rounded,
                        color: Colors.white,
                        size: 28,
                      )),
                  IconButton(
                      onPressed: () {
                        _controller.pickPhoto();
                      },
                      icon: Icon(
                        Icons.picture_in_picture_rounded,
                        color: Colors.white,
                        size: 28,
                      ))
                ],
              ),
            ),

            Align(
              alignment: Alignment.center,
              child: Container(
                width: boxSize,
                height: boxSize,
                decoration: BoxDecoration(
                  border: Border(
                      left: BorderSide(color: Colors.orangeAccent, width: 2),
                      right: BorderSide(color: Colors.orangeAccent, width: 2),
                      top: BorderSide(color: Colors.orangeAccent, width: 2),
                      bottom: BorderSide(color: Colors.orangeAccent, width: 2)),
                ),
              ),
            )
          ],
        ),
      ),
    );
  }
}

博客

关于插件使用,可以参考我的两篇博客:

《Flutter 最佳扫码插件》

《Flutter 最佳扫码插件——自定义视图》

例子

一个完整的例子,请看 这里