本文使用的是flutter_blue_plus
插件来实现链接蓝牙之后,和设备直接实现数据互相传输的功能。
1、配置蓝牙权限
iOS权限设置
<key>NSBluetoothAlwaysUsageDescription</key>
<string>App需要您的同意,才能访问蓝牙,进行设备连接,数据通讯服务</string>
<key>NSBluetoothPeripheralUsageDescription</key>
<string>App需要您的同意,才能访问蓝牙,进行设备连接,数据通讯服务</string>
Android权限设置
<!-- 蓝牙-->
<!-- google play store需要-->
<uses-feature
android:name="android.hardware.bluetooth_le"
android:required="false" />
<!-- Android 12-->
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<!-- Android 11 及以下-->
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION " />
2、添加flutter_blue_plus
插件
flutter_blue_plus: ^1.31.8
3、搜索蓝牙设备列表页面,如图:
代码如下:
import 'dart:async';
import 'dart:io';
import 'package:demo/view/device_screen.dart';
import 'package:flutter/material.dart';
import 'package:flutter_blue_plus/flutter_blue_plus.dart';
import 'package:get/get.dart';
class BluetoothPage extends StatefulWidget {
const BluetoothPage({super.key});
@override
State<BluetoothPage> createState() => _BluetoothPageState();
}
class _BluetoothPageState extends State<BluetoothPage> {
///当前已经连接的蓝牙设备
List<BluetoothDevice> _systemDevices = [];
///扫描到的蓝牙设备
List<ScanResult> _scanResults = [];
late StreamSubscription<List<ScanResult>> _scanResultsSubscription;
late StreamSubscription<bool> _isScanningSubscription;
@override
void initState() {
super.initState();
_scanResultsSubscription = FlutterBluePlus.scanResults.listen((results) {
_scanResults = results;
if (mounted) {
setState(() {});
}
}, onError: (error) {
print('Scan Error:$error');
});
_isScanningSubscription = FlutterBluePlus.isScanning.listen((state) {
if (mounted) {
setState(() {});
}
});
}
@override
void dispose() {
_scanResultsSubscription.cancel();
_isScanningSubscription.cancel();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text("蓝牙"),
),
body: ListView(
children: [
..._buildSystemDeviceTiles(),
..._buildScanResultTiles(),
],
),
floatingActionButton: FlutterBluePlus.isScanningNow
? FloatingActionButton(
onPressed: () {
FlutterBluePlus.stopScan();
},
backgroundColor: Colors.red,
child: const Text("Stop"),
)
: FloatingActionButton(
onPressed: () async {
try {
_systemDevices =