一、插件介绍

fluttertpc_r_scan 是一个功能强大的 Flutter 二维码/条形码扫描插件,专为适配鸿蒙(HarmonyOS)系统而定制。该插件基于 r_scan@0.1.6+1 开发,提供了多种扫描方式,支持从图片文件、网络 URL、内存数据以及相机实时扫描二维码和条形码。

核心功能特性

  • 多源扫描支持

    • 从本地图片文件扫描
    • 从网络图片 URL 扫描
    • 从内存中的图片数据扫描
    • 相机实时扫描
  • 丰富的条码类型支持

    • 二维码:QR Code、Data Matrix、PDF417、Aztec 等
    • 一维码:EAN-8、EAN-13、UPC-A、UPC-E、Code 39、Code 93、Code 128 等
  • 相机控制功能

    • 闪光灯开关控制
    • 多种分辨率预设
    • 前后摄像头切换
    • 自动对焦支持
  • 跨平台兼容性

    • 完美适配鸿蒙系统
    • API 调用方式与 iOS/Android 保持一致

二、安装与配置

由于该插件是为鸿蒙系统定制的修改版本,需要通过 Git 方式引入依赖。

1. 添加依赖

在项目的 pubspec.yaml 文件中,dependencies 部分添加以下配置:

dependencies:
  r_scan:
    git:
      url: "https://gitcode.com/openharmony-sig/fluttertpc_r_scan.git"

2. 安装依赖

执行以下命令获取依赖包:

flutter pub get

3. 权限配置

使用相机扫描功能时,需要在项目中配置相机权限:

鸿蒙平台(ohos)

ohos/entry/src/main/module.json5 文件中添加相机权限:

{
  "module": {
    "requestPermissions": [
      {
        "name": "ohos.permission.CAMERA"
      }
    ]
  }
}

三、使用方法

1. 导入包

import 'package:r_scan/r_scan.dart';

2. 扫描本地图片文件

// 扫描本地图片文件
final RScanResult? result = await RScan.scanImagePath('/path/to/image.jpg');
if (result != null && result.message != null) {
  print('扫描结果:${result.message}');
  print('条码类型:${result.type}');
}

3. 扫描网络图片 URL

// 扫描网络图片
final RScanResult? result = await RScan.scanImageUrl('https://example.com/qrcode.jpg');
if (result != null && result.message != null) {
  print('扫描结果:${result.message}');
}

4. 扫描内存中的图片数据

// 从资源文件加载图片并扫描
ByteData data = await rootBundle.load('assets/images/qrcode.png');
final RScanResult? result = await RScan.scanImageMemory(data.buffer.asUint8List());
if (result != null && result.message != null) {
  print('扫描结果:${result.message}');
}

5. 相机实时扫描

相机实时扫描是该插件最常用的功能,以下是完整的实现步骤:

5.1 获取可用相机列表
List<RScanCameraDescription>? _cameras;

void initState() {
  super.initState();
  // 获取可用相机列表
  availableRScanCameras().then((cameras) {
    setState(() {
      _cameras = cameras;
    });
  });
}
5.2 初始化相机控制器
RScanCameraController? _controller;

void _initializeCamera() {
  if (_cameras != null && _cameras!.isNotEmpty) {
    // 使用后置摄像头,高分辨率
    _controller = RScanCameraController(
      _cameras!.firstWhere((camera) => camera.lensDirection == RScanCameraLensDirection.back),
      RScanCameraResolutionPreset.high,
    );

    // 初始化相机
    _controller!.initialize().then((_) {
      if (!mounted) return;
      setState(() {});
      // 开始扫描
      _controller!.startScan();
    });

    // 监听扫描结果
    _controller!.addListener(() {
      final result = _controller!.result;
      if (result != null && result.message != null) {
        // 处理扫描结果
        print('相机扫描结果:${result.message}');
        // 可以在这里停止扫描或跳转到其他页面
        // _controller!.stopScan();
      }
    });
  }
}
5.3 构建相机预览界面

Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(title: Text('二维码扫描')),
    body: _cameras == null
        ? Center(child: Text('正在检测相机...'))
        : _controller == null || !_controller!.value.isInitialized!
            ? Center(child: CircularProgressIndicator())
            : Stack(
                children: [
                  // 相机预览
                  AspectRatio(
                    aspectRatio: _controller!.value.aspectRatio,
                    child: RScanCamera(_controller!),
                  ),
                  // 扫描框覆盖层
                  ScanOverlayWidget(),
                  // 闪光灯控制按钮
                  Align(
                    alignment: Alignment.bottomCenter,
                    child: Padding(
                      padding: EdgeInsets.only(bottom: 30),
                      child: IconButton(
                        icon: Icon(Icons.flash_on, size: 36, color: Colors.white),
                        onPressed: () async {
                          bool isFlashOn = await _controller!.getFlashMode() ?? false;
                          await _controller!.setFlashMode(!isFlashOn);
                        },
                      ),
                    ),
                  ),
                ],
              ),
    floatingActionButton: FloatingActionButton(
      onPressed: _initializeCamera,
      child: Icon(Icons.camera_alt),
    ),
  );
}
5.4 资源释放

void dispose() {
  _controller?.dispose();
  super.dispose();
}

6. 闪光灯控制

// 打开闪光灯
await _controller!.setFlashMode(true);

// 关闭闪光灯
await _controller!.setFlashMode(false);

// 获取闪光灯状态
bool isFlashOn = await _controller!.getFlashMode() ?? false;

四、RScanResult 结果解析

所有扫描方法都会返回 RScanResult 对象,包含以下信息:

class RScanResult {
  final RScanBarType? type;     // 条码类型
  final String? message;        // 扫描内容
  final List<RScanPoint>? points; // 条码位置点
}

class RScanPoint {
  final double? x;  // X坐标
  final double? y;  // Y坐标
}

使用示例

if (result != null) {
  print('扫描类型: ${result.type}');
  print('扫描内容: ${result.message}');
  if (result.points != null) {
    print('条码位置:');
    for (var point in result.points!) {
      print('  (${point.x}, ${point.y})');
    }
  }
}

五、约束与限制

系统兼容性

  • Flutter 版本:3.7.12-ohos-1.0.6
  • SDK 版本:5.0.0(12)
  • IDE 版本:DevEco Studio 5.0.13.200
  • ROM 版本:5.1.0.120 SP3

功能支持情况

鸿蒙平台支持所有核心功能,包括:

  • ✅ 图片文件扫描
  • ✅ 图片 URL 扫描
  • ✅ 图片内存扫描
  • ✅ 相机实时扫描
  • ✅ 闪光灯控制
  • ✅ 多分辨率支持

六、总结

fluttertpc_r_scan 插件为鸿蒙系统提供了全面的二维码/条形码扫描解决方案,其丰富的功能和易用的 API 使得开发者能够轻松集成扫码功能到自己的应用中。无论是简单的图片扫码还是复杂的相机实时扫描场景,该插件都能提供稳定可靠的性能。

通过 Git 方式引入依赖,开发者可以快速将该插件集成到 Flutter 项目中,并享受与 iOS/Android 平台一致的开发体验。

如果您在使用过程中遇到问题或有任何建议,欢迎参与社区讨论和贡献代码。

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐