Flutter蓝牙背景设置插件flutter_blue_background的使用
Flutter蓝牙背景设置插件flutter_blue_background的使用
Flutter Blue Background 允许你在后台为Android和iOS平台实现蓝牙低功耗(BLE)功能。该插件旨在方便地处理BLE通信任务,例如连接到设备、读取和写入特征值,即使你的Flutter应用程序在后台运行。
功能
- 在后台平滑地集成BLE(蓝牙低功耗)操作与Flutter应用。
- 连接到BLE设备并执行特征值的读取和写入操作。
- 支持Android和iOS平台。
开始使用
Android
更新compileSdkVersion
和minSdkVersion
flutter_blue_background
仅支持从compileSdkVersion
版本34和minSdkVersion
版本21开始。因此,你需要在android/app/build.gradle
文件中更改这些版本:
android {
compileSdkVersion 34
defaultConfig {
minSdkVersion 21
添加权限和服务
在android/app/src/main/AndroidManifest.xml
文件中添加相应的权限、服务和接收器:
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 添加这些权限 -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_LOCATION"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC"/>
<uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.BLUETOOTH_SCAN"
android:usesPermissionFlags="neverForLocation" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
<uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
<uses-permission android:name="android.permission.BLUETOOTH_STACK" />
<uses-permission android:name="android.permission.BLUETOOTH_USE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />
<!-- 结束 -->
<application
android:label="flutter_blue_background_example"
android:name="${applicationName}"
android:icon="@mipmap/ic_launcher">
<activity
android:name=".MainActivity"
android:exported="true"
android:launchMode="singleTop"
android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize">
<!-- 指定一个Android主题应用于此Activity,当Android进程启动时。这个主题对用户可见,直到Flutter UI初始化完成。之后,这个主题将继续确定窗口背景 -->
<meta-data
android:name="io.flutter.embedding.android.NormalTheme"
android:resource="@style/NormalTheme"
/>
<!-- 添加这个 -->
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
<action android:name="FLUTTER_NOTIFICATION_CLICK"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
<!-- 结束这个 -->
</activity>
<!-- 不要删除下面的元数据。这是由Flutter工具生成GeneratedPluginRegistrant.java所使用的 -->
<meta-data
android:name="flutterEmbedding"
android:value="2" />
<!-- 添加这个 -->
<service
android:name="com.dexterous.flutterlocalnotifications.ForegroundService"
android:exported="false"
android:stopWithTask="false"/>
<receiver android:exported="false" android:name="com.dexterous.flutterlocalnotifications.ActionBroadcastReceiver" />
<receiver android:exported="false" android:name="com.dexterous.flutterlocalnotifications.ScheduledNotificationReceiver" />
<receiver android:exported="false" android:name="com.dexterous.flutterlocalnotifications.ScheduledNotificationBootReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<action android:name="android.intent.action.MY_PACKAGE_REPLACED"/>
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
<action android:name="com.htc.intent.action.QUICKBOOT_POWERON"/>
</intent-filter>
</receiver>
<!-- 结束这个 -->
</application>
</manifest>
警告:
- 必须确保所有所需权限在启动服务之前被授予。
- 使用
permission_handler
和location
包来获取用户权限。如果遇到任何困难,请参阅示例文件夹以获取指导。
iOS
添加权限
在ios/Runner/Info.plist
中添加以下权限描述:
<dict>
<key>NSBluetoothAlwaysUsageDescription</key>
<string>App needs Bluetooth permission</string>
<key>NSBluetoothPeripheralUsageDescription</key>
<string>Need BLE permission</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>App needs location permission</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>App needs location permission</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>App needs location permission</string>
<!-- 根据您的应用需求添加其他必要的键和描述 -->
</dict>
确保在应用这些配置后彻底测试您的应用,以确保其正常工作。
使用方法
启动后台服务
为了启动BLE操作的后台服务,使用startFlutterBackgroundService
方法。在这个回调函数中,你可以执行后台任务。
await FlutterBlueBackground.startFlutterBackgroundService(() {
// 您的后台任务在这里
});
连接到BLE设备
使用connectToDevice
方法在后台连接到BLE设备。提供设备名称、服务UUID和特征UUID来识别特定的设备和特征。
await FlutterBlueBackground.connectToDevice(
deviceName: 'DeviceName',
serviceUuid: 'ServiceUUID',
characteristicUuid: 'CharacteristicUUID',
);
从特征读取数据
要从特征读取数据,使用readData
方法。提供服务UUID和特征UUID。
String? data = await FlutterBlueBackground.readData(
serviceUuid: 'ServiceUUID',
characteristicUuid: 'CharacteristicUUID',
);
在Android中,当重新打开应用时,检索之前存储的数据
SharedPreferences preferences = await SharedPreferences.getInstance();
await preferences.reload();
// 从SharedPreferences检索存储的数据
final log = preferences.getStringList('getReadData') ?? [];
向特征写入数据
要向特征写入数据,使用writeData
方法。提供服务UUID、特征UUID和要写入的数据。
await FlutterBlueBackground.writeData(
serviceUuid: 'ServiceUUID',
characteristicUuid: 'CharacteristicUUID',
data: 'DataToWrite',
);
停止后台服务
await FlutterBlueBackground.stopFlutterBackgroundService();
清除已读取值列表
await FlutterBlueBackground.clearReadStorage();
示例
await FlutterBlueBackground.startFlutterBackgroundService(() {
//
await FlutterBlueBackground.connectToDevice(
deviceName: 'DeviceName',
serviceUuid: 'ServiceUUID',
characteristicUuid: 'CharacteristicUUID',
);
// 向特定特征写入值
await FlutterBlueBackground.writeData(
serviceUuid: 'ServiceUUID',
characteristicUuid: 'CharacteristicUUID',
data: 'DataToWrite',
);
// 读取值
String? data = await FlutterBlueBackground.readData(
serviceUuid: 'ServiceUUID',
characteristicUuid: 'CharacteristicUUID',
);
print("Data in main is $data");
print("Executing function in the background");
});
更多关于Flutter蓝牙背景设置插件flutter_blue_background的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter蓝牙背景设置插件flutter_blue_background的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用flutter_blue_background
(假设这是一个用于设置蓝牙背景或相关功能的插件,虽然实际中我并未找到这样一个具体命名的插件,但我会根据常见的蓝牙操作插件的逻辑给出一个类似的示例)来进行蓝牙背景设置的代码案例。请注意,由于flutter_blue_background
不是实际存在的Flutter插件,这里的代码将基于Flutter中处理蓝牙的常用插件flutter_blue
来展示如何进行蓝牙操作,并模拟背景设置的概念。
1. 添加依赖
首先,在你的pubspec.yaml
文件中添加flutter_blue
依赖:
dependencies:
flutter:
sdk: flutter
flutter_blue: ^x.y.z # 请替换为最新版本号
然后运行flutter pub get
来安装依赖。
2. 初始化蓝牙
在你的Flutter应用中,初始化蓝牙适配器并处理权限请求。以下是一个基本的示例:
import 'package:flutter/material.dart';
import 'package:flutter_blue/flutter_blue.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: BluetoothScreen(),
);
}
}
class BluetoothScreen extends StatefulWidget {
@override
_BluetoothScreenState createState() => _BluetoothScreenState();
}
class _BluetoothScreenState extends State<BluetoothScreen> {
final FlutterBlue flutterBlue = FlutterBlue.instance;
@override
void initState() {
super.initState();
flutterBlue.state.listen((state) {
// Handle Bluetooth state changes here
if (state == BluetoothState.on) {
print("Bluetooth is on");
// 可以在这里进行背景设置相关的初始化
}
});
// 请求位置权限(蓝牙扫描需要位置权限)
flutterBlue.requestLocation().then((granted) {
if (!granted) {
// 处理权限被拒绝的情况
}
});
// 开始扫描设备
flutterBlue.startScanning(allowDuplicates: false);
flutterBlue.scanResults.listen((results) {
// 处理扫描到的设备
setState(() {
// 例如,更新UI显示设备列表
});
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Bluetooth Example'),
),
body: Center(
child: Text('Scanning for devices...'),
),
);
}
@override
void dispose() {
flutterBlue.stopScanning();
super.dispose();
}
}
3. 模拟背景设置
由于flutter_blue
本身并不提供背景设置功能,我们可以模拟一个背景设置的过程,比如当找到特定设备时,改变应用的背景颜色。
class _BluetoothScreenState extends State<BluetoothScreen> {
// ... 其他代码 ...
void handleDeviceDiscovery(List<ScanResult> results) {
// 假设我们有一个特定的设备地址
final String targetDeviceAddress = 'XX:XX:XX:XX:XX:XX';
for (var result in results) {
if (result.device.address == targetDeviceAddress) {
// 当找到目标设备时,改变背景颜色
setState(() {
// 例如,设置背景为绿色
// 注意:这里只是模拟,实际中可能需要更复杂的逻辑来设置整个应用的背景
// 可以通过主题或者背景容器来实现
});
break;
}
}
}
@override
void initState() {
super.initState();
// ... 其他初始化代码 ...
flutterBlue.scanResults.listen((results) {
handleDeviceDiscovery(results);
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Bluetooth Example'),
),
body: Container(
// 这里可以根据状态设置背景颜色
color: Colors.white, // 默认背景颜色
child: Center(
child: Text('Scanning for devices...'),
),
),
);
}
// ... 其他代码 ...
}
请注意,上述代码中的handleDeviceDiscovery
函数和build
方法中的背景颜色设置只是模拟了背景设置的概念。在实际应用中,你可能需要更复杂的逻辑来动态地根据蓝牙设备状态或其他条件来改变应用的背景或主题。
由于flutter_blue_background
并非一个实际存在的插件,因此上述代码是基于flutter_blue
插件进行蓝牙操作,并模拟了背景设置的过程。如果你确实有一个名为flutter_blue_background
的插件,并且它有特定的API用于设置蓝牙背景,请查阅该插件的官方文档以获取正确的使用方法和API。