# flutter_bluetooth **Repository Path**: heytun/flutter_bluetooth ## Basic Information - **Project Name**: flutter_bluetooth - **Description**: flutter实现ios、android的蓝牙连接 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-10-12 - **Last Updated**: 2025-10-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # flutter_bluetooth #### 介绍 本项目使用 Flutter 实现 iOS 与 Android 的蓝牙功能,聚焦于播放器场景:手机作为发送端,将歌曲文件通过蓝牙发送到目标设备,支持扫描、发现、连接、传输(分片上传)与断开连接。 > 当前实现基于 BLE(GATT)。若需要 Classic Bluetooth(例如 A2DP/OBEX)以实现高质量实时音频流,应在原生层或使用不同插件中补充实现。 #### 特性 - 扫描附近蓝牙设备(支持按 UUID / RSSI 过滤) - 发现设备服务与特征(GATT) - 建立连接并管理连接状态 - 通过 GATT 特征分片发送歌曲文件(手机端为发送者,目标设备不保存原始歌曲) - 连接断开与错误回调处理 - 示例代码与调试步骤 #### 兼容性与依赖 - Flutter:建议使用最新稳定版(推荐 Flutter 3.x / 4.x 可兼容最新 SDK) - Android minSdkVersion:建议 >= 21 - iOS deployment target:建议 >= 11.0 - 主要插件:flutter_blue_plus(BLE) #### 安装 1. 在 `pubspec.yaml` 中添加依赖(示例,使用指定版本): ```yaml dependencies: flutter: sdk: flutter flutter_blue_plus: ^2.0.0 ``` 2. 获取依赖: ```bash flutter pub get ``` #### 权限与平台配置 Android(在 `android/app/src/main/AndroidManifest.xml` 中)示例: ```xml ``` 注意:运行时请按 Android 版本请求对应权限(Android 12+ 需要单独请求 BLUETOOTH_CONNECT/SCAN/ADVERTISE)。 iOS(在 `ios/Runner/Info.plist` 中)需要添加使用说明: - NSBluetoothAlwaysUsageDescription - NSBluetoothPeripheralUsageDescription - NSMicrophoneUsageDescription(如需录音/音频相关权限) #### 快速开始(示例代码) 下面示例使用 `flutter_blue_plus` 展示扫描、连接、发现服务与通过可写特征分片发送文件的基本流程(示例为简化版): ```dart import 'dart:io'; import 'package:flutter_blue_plus/flutter_blue_plus.dart'; class BluetoothSender { final FlutterBluePlus _ble = FlutterBluePlus.instance; BluetoothDevice? _device; BluetoothCharacteristic? _writeChar; Future startScan(Function(ScanResult) onFound) async { _ble.startScan(timeout: const Duration(seconds: 5)); _ble.scanResults.listen((results) { for (var r in results) onFound(r); }); } Future connect(String deviceId) async { _device = await _ble.connectToDevice(id: DeviceIdentifier(deviceId)); await Future.delayed(const Duration(seconds: 1)); await discoverServices(); } Future discoverServices() async { if (_device == null) throw Exception('Device not connected'); final services = await _device!.discoverServices(); for (var s in services) { for (var c in s.characteristics) { if (c.properties.write || c.properties.writeWithoutResponse) { _writeChar = c; return; } } } if (_writeChar == null) throw Exception('No writable characteristic found'); } Future sendFile(String path, {int mtu = 180}) async { if (_writeChar == null) throw Exception('No write characteristic'); final file = File(path); final bytes = await file.readAsBytes(); final chunkSize = mtu - 3; // 留出 ATT overhead for (var offset = 0; offset < bytes.length; offset += chunkSize) { final end = (offset + chunkSize < bytes.length) ? offset + chunkSize : bytes.length; final chunk = bytes.sublist(offset, end); await _writeChar!.write(chunk, withoutResponse: true); await Future.delayed(const Duration(milliseconds: 20)); } } Future disconnect() async { if (_device != null) { await _device!.disconnect(); _device = null; _writeChar = null; } } } ``` #### 常见问题 — 高质量实时音频 FAQ Q: 普通 3 分钟左右的歌曲是否算“高质量实时音频”? A: 不是。3 分钟左右的歌曲通常是一个完整的音频文件,它属于“文件传输”场景(phone → device),可以通过 BLE 分片上传。"高质量实时音频" 指的是持续的、低延迟且高比特率的音频流(例如在手机与蓝牙耳机之间实时播放音乐,通常使用 A2DP/Classic Bluetooth,采样率 44.1kHz/16-bit 或更高、低延迟),需要更高带宽和原生支持,BLE 并不适合此类实时高质量音频流。 #### 运行与调试 1. 获取依赖: ```bash flutter pub get ``` 2. 列出设备并选择真机运行: ```bash flutter devices flutter run -d ``` 3. Android: 如需在设备上直接授予权限(调试用): ```bash adb shell pm grant your.package.name android.permission.BLUETOOTH_CONNECT adb shell pm grant your.package.name android.permission.BLUETOOTH_SCAN adb shell pm grant your.package.name android.permission.ACCESS_FINE_LOCATION ``` 注意:Android 模拟器通常不支持蓝牙,iOS 必须在真机上测试蓝牙功能。 #### 贡献 欢迎提交 issue 与 PR:Fork → 新建分支 → 提交 → 发起 PR。 #### 作者与联系方式 - 作者:阿威 - 联系方式:309243326 #### 许可证 本项目遵循 Apache License 2.0(见 LICENSE)。 如何运行 Demo(iOS 真机) 1. 在项目根运行依赖获取: ```bash flutter pub get ``` 2. 在 `ios/` 目录下安装 CocoaPods(如需要): ```bash cd ios; pod install; cd .. ``` 3. 连接 iOS 真机并运行: ```bash flutter devices flutter run -d ``` 调试提示: - 如果遇到 CocoaPods 相关错误,请在 `ios/` 文件夹执行 `pod repo update` 后重试。 - 确保在 Xcode 中选中合适的签名(Signing)配置,或先使用 `flutter run` 让 Flutter 尝试处理签名。 重要提示 — `pod` 在 Windows 上不可用 如果你在 Windows 上执行 `pod install` 并看到类似: ``` pod : 无法将“pod”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。 ``` 这是因为 CocoaPods 是 macOS 上的工具(基于 Ruby 的 gem),只能在 macOS(或 macOS CI)上安装和运行。Windows 环境不能直接运行 `pod`、也无法进行 iOS 的 Xcode 构建工作。 可行的解决办法: 1) 在 macOS 机器上执行(推荐) 1. 安装 Homebrew(如果还没安装): ```bash /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" ``` 2. 安装 CocoaPods(或使用 gem): ```bash brew install cocoapods # 或者 sudo gem install cocoapods ``` 3. 进入项目 ios 目录并安装依赖: ```bash cd ios pod install cd .. ``` 2) 使用 macOS CI / 云 Mac 服务 如果你没有本地 macOS,可以使用 GitHub Actions (macOS runner)、Codemagic、Bitrise、MacStadium 等进行构建与 `pod install`。 3) 远程 macOS 把仓库推到远端(或使用远程 Mac),在那台 macOS 上运行 `pod install` 并部署或调试。 不可行的方法(注意) - 在 Windows 上尝试用 WSL 运行 `pod` 并不可行用于 iOS 构建,因为 iOS 构建链依赖 Xcode/macOS。 如果你希望,我可以: - 在 README 中加入一段更详细的 macOS/CocoaPods 安装说明(已添加到本文件)。 - 帮你生成一个 GitHub Actions 示例 workflow 来在 macOS runner 上自动执行 `flutter pub get` 和 `pod install`,并进行构建(如果你想要 CI 示例,请告诉我)。 下一步建议: - 添加状态管理(Provider/Bloc)以更好地组织 UI 与数据流。 - 把 demo bytes 替换为文件选择(`file_picker`)并在 README 中列出相关权限。 - 如果要支持 Android,请告知,我会把 Android 实现补上并调整权限说明。