Flutter蓝牙通信插件flutter_beacon的使用

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

Flutter蓝牙通信插件flutter_beacon的使用

Flutter Beacon

Pub GitHub License Build Coverage Status FOSSA Status codecov

flutter_beacon 是一个用于与iBeacons交互的Flutter插件。它支持Android API 18+ 和 iOS 8+,提供了自动权限管理、iBeacon扫描和广播等功能。

功能特性

  • 自动权限管理
  • 扫描iBeacons
  • 监控iBeacons
  • 广播为iBeacon

安装

pubspec.yaml 文件中添加依赖:

dependencies:
  flutter_beacon: latest

Android 特定设置

对于目标SDK版本29+(Android 10, 11),需要手动添加 ACCESS_FINE_LOCATION 权限:

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

如果还需要后台扫描功能,则需添加:

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

iOS 特定设置

为了使用beacon相关功能,应用需要请求位置权限。这分为两步:

  1. 在配置文件中声明所需权限。
  2. 在应用运行时请求用户授权(插件可以自动处理)。

ios/Runner/Info.plist 中声明权限:

<dict>
  <!-- When in use -->
  <key>NSLocationWhenInUseUsageDescription</key>
  <string>Reason why app needs location</string>
  <!-- Always -->
  <!-- for iOS 11 + -->
  <key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
  <string>Reason why app needs location</string>
  <!-- for iOS 9/10 -->
  <key>NSLocationAlwaysUsageDescription</key>
  <string>Reason why app needs location</string>
  <!-- Bluetooth Privacy -->
  <!-- for iOS 13 + -->
  <key>NSBluetoothAlwaysUsageDescription</key>
  <string>Reason why app needs bluetooth</string>
</dict>

使用方法

Ranging API设计为响应式流。

初始化库

try {
  // 如果你想要手动检查所需的权限
  await flutterBeacon.initializeScanning;
  
  // 或者如果你想要包含自动检查权限
  await flutterBeacon.initializeAndCheckScanning;
} on PlatformException catch(e) {
  // 库初始化失败,检查错误代码和消息
}

扫描Beacons

final regions = <Region>[];

if (Platform.isIOS) {
  // iOS平台,至少设置identifier和proximityUUID进行区域扫描
  regions.add(Region(
      identifier: 'Apple Airlocate',
      proximityUUID: 'E2C56DB5-DFFB-48D2-B060-D0F5A71096E0'));
} else {
  // Android平台,它可以扫描所有Proximity UUID的beacon
  regions.add(Region(identifier: 'com.beacon'));
}

// 开始扫描beacons
_streamRanging = flutterBeacon.ranging(regions).listen((RangingResult result) {
  // result 包含一个区域和找到的beacon列表
  // 列表可以为空,如果没有找到匹配的beacon
});

// 停止扫描beacons
_streamRanging.cancel();

监控Beacons

final regions = <Region>[];

if (Platform.isIOS) {
  // iOS平台,至少设置identifier和proximityUUID进行区域监控
  regions.add(Region(
      identifier: 'Apple Airlocate',
      proximityUUID: 'E2C56DB5-DFFB-48D2-B060-D0F5A71096E0'));
} else {
  // Android平台,它可以监控所有Proximity UUID的beacon
  regions.add(Region(identifier: 'com.beacon'));
}

// 开始监控beacons
_streamMonitoring = flutterBeacon.monitoring(regions).listen((MonitoringResult result) {
  // result 包含一个区域、事件类型和事件状态
});

// 停止监控beacons
_streamMonitoring.cancel();

示例代码

以下是一个完整的示例应用程序代码,展示了如何使用 flutter_beacon 插件:

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_beacon/flutter_beacon.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Beacon Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: BeaconHomePage(),
    );
  }
}

class BeaconHomePage extends StatefulWidget {
  @override
  _BeaconHomePageState createState() => _BeaconHomePageState();
}

class _BeaconHomePageState extends State<BeaconHomePage> {
  StreamSubscription<RangingResult>? _streamRanging;

  @override
  void initState() {
    super.initState();
    _initializeBeacon();
  }

  Future<void> _initializeBeacon() async {
    try {
      await flutterBeacon.initializeAndCheckScanning;
    } on PlatformException catch (e) {
      print('Failed to initialize beacon: ${e.message}');
    }
  }

  void startRangingBeacons() {
    final regions = <Region>[
      Region(identifier: 'com.beacon')
    ];

    _streamRanging?.cancel();
    _streamRanging = flutterBeacon.ranging(regions).listen((RangingResult result) {
      setState(() {
        // 更新UI逻辑
      });
    });
  }

  void stopRangingBeacons() {
    _streamRanging?.cancel();
  }

  @override
  void dispose() {
    _streamRanging?.cancel();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Beacon Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: startRangingBeacons,
              child: Text('Start Ranging Beacons'),
            ),
            ElevatedButton(
              onPressed: stopRangingBeacons,
              child: Text('Stop Ranging Beacons'),
            ),
          ],
        ),
      ),
    );
  }
}

此示例代码创建了一个简单的Flutter应用程序,其中包含两个按钮:一个用于开始扫描附近的iBeacons,另一个用于停止扫描。当点击“Start Ranging Beacons”按钮时,程序将启动对指定区域内iBeacons的扫描,并在控制台输出结果;点击“Stop Ranging Beacons”按钮则会取消当前正在进行的扫描任务。

请注意,在实际开发过程中,您可能需要根据具体需求调整UI布局以及处理扫描到的数据。此外,确保按照上述说明正确配置了iOS和Android项目的权限设置。


更多关于Flutter蓝牙通信插件flutter_beacon的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter蓝牙通信插件flutter_beacon的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个使用 flutter_beacon 插件进行蓝牙通信的示例代码。这个插件允许你扫描和监听iBeacon设备。请注意,实际使用中你需要确保在 pubspec.yaml 文件中添加了 flutter_beacon 依赖,并且已经正确配置了相应的权限(尤其是在 Android 和 iOS 上)。

1. 添加依赖

首先,在你的 pubspec.yaml 文件中添加 flutter_beacon 依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_beacon: ^0.x.x  # 请检查最新版本号并替换

然后运行 flutter pub get

2. 配置权限

Android

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

<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

确保你的应用有位置权限,因为在 Android 12 及更高版本中,蓝牙扫描需要位置权限。

iOS

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

<key>NSBluetoothAlwaysUsageDescription</key>
<string>App needs bluetooth access</string>
<key>NSBluetoothPeripheralUsageDescription</key>
<string>App needs bluetooth access</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>App needs location access to scan for beacons</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>App needs location access to scan for beacons</string>

3. 使用 Flutter 代码扫描 iBeacon

以下是一个简单的 Flutter 应用示例,用于扫描和监听 iBeacon 设备:

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

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

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

class _MyAppState extends State<MyApp> {
  List<Beacon> _beacons = [];

  @override
  void initState() {
    super.initState();
    _startScanning();
  }

  void _startScanning() {
    FlutterBeacon.startMonitoring().then((_) {
      FlutterBeacon.startRanging().listen((beacons) {
        setState(() {
          _beacons = beacons;
        });
      });
    }).catchError((error) {
      print("Error starting beacon monitoring: $error");
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Beacon Scanner'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text('Scanning for beacons...'),
              SizedBox(height: 20),
              Expanded(
                child: _beacons.isEmpty
                    ? Center(child: Text('No beacons found'))
                    : ListView.builder(
                        itemCount: _beacons.length,
                        itemBuilder: (context, index) {
                          Beacon beacon = _beacons[index];
                          return Card(
                            child: ListTile(
                              title: Text('UUID: ${beacon.uuid}'),
                              subtitle: Text('Major: ${beacon.major}, Minor: ${beacon.minor}, Distance: ${beacon.distance}'),
                            ),
                          );
                        },
                      ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

解释

  1. 权限配置:确保在 AndroidManifest.xmlInfo.plist 中添加了必要的权限。
  2. 启动扫描:在 initState 方法中调用 _startScanning 方法,开始监控和测距 iBeacon 设备。
  3. 显示结果:使用 ListView.builder 显示扫描到的 iBeacon 设备信息。

注意事项

  • 确保设备蓝牙已打开。
  • 在实际部署前,请测试不同的设备和操作系统版本,以确保兼容性和稳定性。
  • 权限请求逻辑(尤其是在 iOS 上)可能需要更复杂的处理,特别是在用户首次启动应用时。

希望这个示例能帮助你开始使用 flutter_beacon 插件进行蓝牙通信。如果有任何问题或需要进一步的帮助,请随时提问。

回到顶部