Flutter二维码扫描插件stratosfy_scanner的使用

Flutter二维码扫描插件stratosfy_scanner的使用

简介

stratosfy_scanner 是一个用于在 Flutter 应用中实现二维码扫描功能的跨平台插件。它可以运行在 Android 和 iOS 平台上,并支持后台扫描。


使用步骤

1. 添加依赖

首先,在项目的 pubspec.yaml 文件中添加 stratosfy_scanner 作为依赖:

dependencies:
  stratosfy_scanner: ^版本号

然后运行以下命令以安装依赖:

flutter pub get

2. 配置 Android 平台

AndroidManifest.xml 配置

在 Android 的 AndroidManifest.xml 文件中添加以下代码以启用嵌入式配置:

<meta-data
    android:name="flutterEmbedding"
    android:value="2" />

同时,确保将 FlutterActivity 替换为 io.flutter.embedding.android.FlutterActivity

<activity
    android:name="io.flutter.embedding.android.FlutterActivity"
    ... />

3. 请求权限

检查权限

检查当前应用是否已获得蓝牙权限:

BluetoothPermissionState permissionState = await StratosfyScanner.getPermissionState();

请求权限

如果权限未被授予,则请求用户授权:

StratosfyScanner.requestPermission();

4. 扫描二维码

前台扫描

在前台运行时扫描二维码:

// 启动扫描
StreamSubscription subscription = StratosfyScanner.scanBeacons().listen((qrCode) {
    // 处理扫描到的二维码数据
    print("Scanned QR Code: $qrCode");
});

// 取消扫描
subscription.cancel();

后台扫描(可选)

在后台运行时继续扫描二维码需要额外配置。

Android 配置

创建一个类继承自 FlutterApplication 并初始化背景扫描服务:

import io.stratosfy.stratosfy_scanner.services.StratosfyBackgroundScanningService;
import io.flutter.app.FlutterApplication;

public class MyApplication extends FlutterApplication {
    @Override
    public void onCreate() {
        super.onCreate();
        StratosfyBackgroundScanningService.initializeWithApplication(this);
    }
}

AndroidManifest.xml 中注册该类:

<application
    android:name=".MyApplication"
    ... >
</application>

创建一个服务类来处理后台扫描逻辑:

import io.stratosfy.stratosfy_scanner.services.StratosfyBackgroundScanningService;
import java.util.ArrayList;
import java.util.HashMap;

public class BackgroundScanner extends StratosfyBackgroundScanningService {

    @Override
    public void onBeaconsDetected(ArrayList<SnowMiBeacon> beacons, HashMap<String, Object> customData) {
        super.onBeaconsDetected(beacons, customData);
        System.out.println("Scanned beacons: " + beacons);
    }
}

AndroidManifest.xml 中定义服务:

<service
    android:name="com.example.BackgroundScanner"
    android:exported="false">
    <intent-filter>
        <action android:name="io.stratosfy.stratosfy_scanner.BACKGROUND_SCANNER" />
    </intent-filter>
</service>
iOS 配置

创建一个类继承自 StratosfyBackgroundScanningServiceDelegate 来接收后台扫描回调:

import Foundation
import CoreLocation
import stratosfy_scanner

class BackgroundScannerResponse: NSObject, StratosfyBackgroundScanningServiceDelegate, CLLocationManagerDelegate {
    
    static let shared = BackgroundScannerResponse()

    func onLocationUpdated(locations: [CLLocation]) {
        print("Location updated: \(locations)")
    }

    func onBeaconDetected(beacons: [SnowMBeacon], customData: Dictionary<String, Any>?) {
        print("Beacon detected: \(beacons)")
    }
}

AppDelegate.swift 中注册扫描委托:

import UIKit
import stratosfy_scanner

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        BackgroundBeaconScanner.shared.delegate = BackgroundScannerResponse.shared
        BackgroundBeaconScanner.shared.locationDelegate = BackgroundScannerResponse.shared
        return true
    }
}

启动后台扫描:

StratosfyScanner.scanBeaconsBackground();

5. 完整示例代码

main.dart

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomeScreen(),
    );
  }
}

class HomeScreen extends StatefulWidget {
  [@override](/user/override)
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  bool _isScanning = false;

  Future<void> _startScan() async {
    setState(() {
      _isScanning = true;
    });

    // 启动扫描
    StreamSubscription subscription = StratosfyScanner.scanBeacons().listen((qrCode) {
      print("Scanned QR Code: $qrCode");
    });

    // 停止扫描
    Future.delayed(Duration(seconds: 10), () {
      setState(() {
        _isScanning = false;
      });
      subscription.cancel();
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("QR Scanner")),
      body: Center(
        child: ElevatedButton(
          onPressed: _startScan,
          child: Text(_isScanning ? "Scanning..." : "Start Scan"),
        ),
      ),
    );
  }
}

更多关于Flutter二维码扫描插件stratosfy_scanner的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


stratosfy_scanner 是一个用于 Flutter 的二维码扫描插件,它允许开发者在应用中集成二维码扫描功能。以下是如何使用 stratosfy_scanner 插件的详细步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  stratosfy_scanner: ^1.0.0  # 请使用最新版本

然后运行 flutter pub get 来获取依赖。

2. 配置权限

在 Android 和 iOS 上,你需要配置相应的权限来使用摄像头。

Android

android/app/src/main/AndroidManifest.xml 文件中添加以下权限:

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

iOS

ios/Runner/Info.plist 文件中添加以下权限:

<key>NSCameraUsageDescription</key>
<string>We need access to your camera to scan QR codes.</string>

3. 使用插件

在你的 Dart 代码中,你可以使用 stratosfy_scanner 来启动二维码扫描并获取结果。

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: QRScannerScreen(),
    );
  }
}

class QRScannerScreen extends StatefulWidget {
  [@override](/user/override)
  _QRScannerScreenState createState() => _QRScannerScreenState();
}

class _QRScannerScreenState extends State<QRScannerScreen> {
  String _scanResult = 'Scan a QR code';

  Future<void> _scanQRCode() async {
    try {
      final result = await StratosfyScanner.scan();
      setState(() {
        _scanResult = result ?? 'No result';
      });
    } catch (e) {
      setState(() {
        _scanResult = 'Failed to scan: $e';
      });
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('QR Code Scanner'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(_scanResult),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _scanQRCode,
              child: Text('Scan QR Code'),
            ),
          ],
        ),
      ),
    );
  }
}
回到顶部