You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Flutter Blue 0.8.0扫描蓝牙设备无结果的问题求助

Flutter Blue 0.8.0 扫描蓝牙设备无结果排查方案

结合你提供的日志、权限配置和代码,以下是具体的问题排查和修复步骤:

1. 修复蓝牙启用逻辑错误

你的_enableBluetooth方法完全错误,当蓝牙未开启时,不应执行startScan/stopScan,而是需要请求系统开启蓝牙:

Future<void> _enableBluetooth() async {
  if (!await flutterBlue.isOn) {
    print('Requesting Bluetooth enable...');
    // 使用FlutterBlue内置方法请求开启蓝牙
    await flutterBlue.turnOn();
  }
}

2. 补全权限请求逻辑

当前仅请求了bluetooth权限,未覆盖Android 12+所需的BLUETOOTH_SCAN/BLUETOOTH_CONNECT,以及低版本Android必需的位置权限:

Future<void> _requestBluetoothPermission() async {
  // 请求蓝牙扫描、连接权限
  await Permission.bluetoothScan.request();
  await Permission.bluetoothConnect.request();
  
  // Android 11及以下版本必须请求位置权限
  if (Platform.isAndroid) {
    final androidInfo = await DeviceInfoPlugin().androidInfo;
    if (androidInfo.version.sdkInt <= 30) {
      await Permission.location.request();
    }
  }

  // 检查权限是否齐全
  final hasScanPerm = await Permission.bluetoothScan.isGranted;
  final hasLocationPerm = await Permission.location.isGranted || 
                          (await DeviceInfoPlugin().androidInfo).version.sdkInt > 30;
  if (!hasScanPerm || !hasLocationPerm) {
    print('缺少必要权限,请授予蓝牙扫描和位置权限');
  }
}

注:需添加device_info_plus依赖来获取Android版本信息

3. 优化扫描结果去重处理

scanResults会返回重复设备条目,需根据设备ID去重:

void _startScanning() {
  setState(() {
    isScanning = true;
  });

  try {
    // 先停止之前的扫描,避免冲突
    await flutterBlue.stopScan();
    flutterBlue.startScan(timeout: Duration(seconds: 4));
    
    flutterBlue.scanResults.listen((results) {
      if (mounted) {
        // 通过设备ID去重
        final uniqueDevices = <BluetoothDevice>{};
        for (final result in results) {
          uniqueDevices.add(result.device);
        }
        setState(() {
          devices = uniqueDevices.toList();
          print('Devices: $devices');
        });
      }
    });
  } catch (e) {
    print('Error starting scan: $e');
  }
}

4. 修正AndroidManifest权限配置

针对不同Android版本拆分权限声明,避免权限冗余:

<!-- 声明BLE硬件依赖 -->
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true" />

<!-- Android 12+ 蓝牙权限 -->
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />

<!-- Android 11及以下权限 -->
<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_FINE_LOCATION" android:maxSdkVersion="30" />

5. 额外检查项

  • 确认附近的蓝牙设备是BLE设备:Flutter Blue仅支持低功耗蓝牙(BLE),传统蓝牙设备无法被扫描到
  • 确保目标设备处于可被发现状态:部分BLE设备默认不广播,需手动开启可发现模式

内容的提问来源于stack exchange,提问作者Mahdi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 12:30:58