我发布的第二个Flutter插件-Flutter二维码扫描(支持文件、url、内存、相机)

介绍

二维码做为信息的载体,普遍应用于咱们生活的方方面面,例如:使用支付宝支付,二维码加好友,二维码推送等等,能举例的例子多不胜数,而若是你的应用支持二维码的扫描,用户和体验将会翻倍的增加,若是你是应用的开发者,欢迎来使用此二维码扫描插件!并但愿能给予项目一个star,谢谢!项目地址:github.com/rhymelph/r_…android

使用

你能够在pub.dev网站上面搜索r_scan便可找到该插件,添加下面代码到pubspec.yaml文件git

dependencies:
 r_scan: last version
复制代码
  • last version 能够在pub.dev网站搜索r_scan获得

各设备注意事项

  • Android平台下

android6.0系统下请动态受权,能够结合permission_handler插件使用,代码以下:github

import 'package:permission_handler/permission_handler.dart';

Future<bool> canReadStorage() async {
    if(Platform.isIOS) return true;
    var status = await PermissionHandler()
        .checkPermissionStatus(PermissionGroup.storage);
    if (status != PermissionStatus.granted) {
      var future = await PermissionHandler()
          .requestPermissions([PermissionGroup.storage]);
      for (final item in future.entries) {
        if (item.value != PermissionStatus.granted) {
          return false;
        }
      }
    } else {
      return true;
    }
    return true;
  }

Future<bool> canOpenCamera() async {
    var status =
        await PermissionHandler().checkPermissionStatus(PermissionGroup.camera);
    if (status != PermissionStatus.granted) {
      var future = await PermissionHandler()
          .requestPermissions([PermissionGroup.camera]);
      for (final item in future.entries) {
        if (item.value != PermissionStatus.granted) {
          return false;
        }
      }
    } else {
      return true;
    }
    return true;
  }
复制代码
  • IOS平台下

须要在info.plist文件下添加以下代码:async

<key>NSCameraUsageDescription</key>
	<string>扫描二维码时须要使用您的相机</string>
	<key>NSPhotoLibraryUsageDescription</key>
	<string>扫描二维码时须要访问您的相册</string>
	<key>io.flutter.embedded_views_preview</key>
    <true/>
复制代码

导包

import 'package:r_scan/r_scan.dart';
复制代码

1.扫描文件图片二维码

final result=await RScan.scanImagePath('你的文件路径');
if(result.isNotEmpty){
    //result 为二维码内容
}
复制代码

2.扫描图片连接二维码

final result=await RScan.scanImagePath('你的图片连接');
if(result.isNotEmpty){
    //result 为二维码内容
}
复制代码

3.扫描内存图片二维码

ByteData data=await rootBundle.load('images/qrCode.png');
final result=await RScan.scanImageMemory(data.buffer.asUint8List());
if(result.isNotEmpty){
    //result 为二维码内容
}
复制代码

4.使用相机扫描二维码

import 'package:flutter/material.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:r_scan/r_scan.dart';

class RScanDialog extends StatefulWidget {
  @override
  _RScanDialogState createState() => _RScanDialogState();
}

class _RScanDialogState extends State<RScanDialog> {
  RScanController _controller;

  @override
  void initState() {
    super.initState();
    initController();
  }
  bool isFirst=true;


  Future<void> initController() async {
    _controller = RScanController();
    _controller.addListener(() {//监听扫描到的二维码
      final result = _controller.result;
      if (result != null) {
        if(isFirst){
          Navigator.of(context).pop(result);
          isFirst=false;
        }
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        backgroundColor: Colors.black,
        body: FutureBuilder<bool>(
          future: canOpenCameraView(),
          builder: (BuildContext context, AsyncSnapshot<bool> snapshot) {
            if (snapshot.hasData && snapshot.data == true) {
              return ScanImageView(//这个为本身写的前景
                child: RScanView(
                  controller: _controller,
                ),
              );
            } else {
              return Container();
            }
          },
        ),
      ),
    );
  }

  Future<bool> canOpenCameraView() async {
    var status =
        await PermissionHandler().checkPermissionStatus(PermissionGroup.camera);
    if (status != PermissionStatus.granted) {
      var future = await PermissionHandler()
          .requestPermissions([PermissionGroup.camera]);
      for (final item in future.entries) {
        if (item.value != PermissionStatus.granted) {
          return false;
        }
      }
    } else {
      return true;
    }
    return true;
  }
}
复制代码

后续开发

  1. 支持手电筒
  2. 支持自定义区域触发扫描
  3. 还有更多...
相关文章
相关标签/搜索