Flutter蓝牙背景设置插件flutter_blue_background的使用

Flutter蓝牙背景设置插件flutter_blue_background的使用

Flutter Blue Background 允许你在后台为Android和iOS平台实现蓝牙低功耗(BLE)功能。该插件旨在方便地处理BLE通信任务,例如连接到设备、读取和写入特征值,即使你的Flutter应用程序在后台运行。

功能

  • 在后台平滑地集成BLE(蓝牙低功耗)操作与Flutter应用。
  • 连接到BLE设备并执行特征值的读取和写入操作。
  • 支持Android和iOS平台。

开始使用

Android

更新compileSdkVersionminSdkVersion

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_handlerlocation包来获取用户权限。如果遇到任何困难,请参阅示例文件夹以获取指导。

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

1 回复

更多关于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。

回到顶部