Flutter蓝牙通信插件flutter_beacon的使用
Flutter蓝牙通信插件flutter_beacon的使用
Flutter Beacon
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相关功能,应用需要请求位置权限。这分为两步:
- 在配置文件中声明所需权限。
- 在应用运行时请求用户授权(插件可以自动处理)。
在 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
更多关于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}'),
),
);
},
),
),
],
),
),
),
);
}
}
解释
- 权限配置:确保在
AndroidManifest.xml
和Info.plist
中添加了必要的权限。 - 启动扫描:在
initState
方法中调用_startScanning
方法,开始监控和测距 iBeacon 设备。 - 显示结果:使用
ListView.builder
显示扫描到的 iBeacon 设备信息。
注意事项
- 确保设备蓝牙已打开。
- 在实际部署前,请测试不同的设备和操作系统版本,以确保兼容性和稳定性。
- 权限请求逻辑(尤其是在 iOS 上)可能需要更复杂的处理,特别是在用户首次启动应用时。
希望这个示例能帮助你开始使用 flutter_beacon
插件进行蓝牙通信。如果有任何问题或需要进一步的帮助,请随时提问。