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

升级Flutter Blue Plus至1.32.8后Android端BLE无扫描结果求助

问题描述

应用在Flutter Blue Plus 1.5.2版本可正常获取周边BLE设备,升级至1.32.8版本(因适配Android 14强制升级)后,Android端无法获取任何扫描结果。日志显示turnOn()返回false,但蓝牙状态为BluetoothAdapterState.on。

已尝试将targetSdkVersion降级至33、替换为Flutter Blue Plus官方Demo测试,均无扫描结果。

相关代码

// handle bluetooth on & off
// note: for iOS the initial state is typically BluetoothAdapterState.unknown
// note: if you have permissions issues you will get stuck at BluetoothAdapterState.unauthorized
// _bluetoothOnOffStreamSubscription?.cancel();
_bluetoothOnOffStreamSubscription ??=
    FlutterBluePlus.adapterState.listen((BluetoothAdapterState state) {
  debugPrint("Bluetooth is: $state");
  if (state == BluetoothAdapterState.on) {
    // usually start scanning, connecting, etc
  } else {
    // show an error to the user, etc
  }
});

// == Add read values listeners
_scanResultsStreamSubscription ??= FlutterBluePlus.scanResults.listen(
  (List<ScanResult> results) {
    debugPrint('Scanning devices nearby: found ${results.length}');

    if (!mounted) return;

    // == Add source devices to the list
    for (ScanResult result in results) {
      debugPrint(
          'Device [${result.device.name}] found nearby! rssi: ${result.rssi}');

      _addDeviceTolist(result);
    }

    if (results.length > 0) if (mounted)
      setState(() {
        // Force the refresh
        scanResultsCount += results.length;
      });
  },
  onError: (e) => print(e),
);


// turn on bluetooth ourself if we can
// for iOS, the user controls bluetooth enable/disable
if (Platform.isAndroid) {
  await FlutterBluePlus.turnOn();
}

FlutterBluePlus.startScan(
  // androidScanMode: AndroidScanMode.lowLatency,
  timeout: duration,
).catchError((e) {
  debugPrint("startScan exception: $e");
});

日志信息

D/[FBP-Android](14379): [FBP] onMethodCall: turnOn
I/flutter (14379): Bluetooth is: BluetoothAdapterState.on
I/flutter (14379): [FBP] <turnOn> result: false
排查思路与解决方案

1. 校验Android权限配置(适配Android 13+/14)

Flutter Blue Plus 1.32.8对Android权限要求与旧版本差异较大,需确保AndroidManifest.xml配置完整:

<!-- 旧版本兼容权限 -->
<uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" />

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

<!-- Android 13+ 扫描无名称/UUID设备需位置权限 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

<!-- 声明BLE硬件依赖 -->
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true" />
  • 若仅扫描BLE设备,可给BLUETOOTH_SCAN添加android:usesPermissionFlags="neverForLocation"减少权限弹窗,但部分设备仍需位置权限才能扫描到无标识设备。
  • 必须在代码中动态申请权限,可使用permission_handler库完成,不能仅依赖Manifest配置。

2. 解析turnOn()返回false的原因

turnOn()返回false常见场景:

  • 硬件故障:测试系统蓝牙或其他蓝牙应用是否能正常开启并扫描,排除硬件问题。
  • 权限缺失:即使蓝牙状态显示开启,缺少BLUETOOTH_ADMIN或系统级权限会导致turnOn()失败,调用前需检查权限状态。
  • 系统限制:Android 14部分设备限制应用直接控制蓝牙开启,建议调整逻辑:监听蓝牙状态,若为off则弹窗引导用户手动开启,而非调用turnOn()。

3. 修正扫描触发逻辑

  • 必须等待蓝牙状态完全切换为BluetoothAdapterState.on后再启动扫描,而非turnOn()后立即执行,因为蓝牙开启是异步操作。修改代码如下:
_bluetoothOnOffStreamSubscription ??=
    FlutterBluePlus.adapterState.listen((BluetoothAdapterState state) {
  debugPrint("Bluetooth is: $state");
  if (state == BluetoothAdapterState.on) {
    // 蓝牙稳定开启后启动扫描
    _startScanning(duration);
  } else {
    // 提示用户开启蓝牙
  }
});

void _startScanning(Duration duration) async {
  if (!await FlutterBluePlus.isScanning) {
    await FlutterBluePlus.startScan(
      timeout: duration,
    ).catchError((e) {
      debugPrint("startScan exception: $e");
    });
  }
}
  • 增加扫描错误监听,定位扫描被拒原因:
FlutterBluePlus.scanResults.listen((results) {
  // 现有扫描结果处理逻辑
}, onError: (e) {
  debugPrint("扫描错误详情: $e");
});

4. 核对版本适配细节

  • 查看Flutter Blue Plus 1.32.8更新日志,确认Android 14适配的变更点(如扫描模式、权限逻辑)。
  • 确保build.gradle配置正确:
android {
    compileSdkVersion 34
    defaultConfig {
        targetSdkVersion 34
        // 其他配置
    }
}
  • 清理缓存后重新构建,排除依赖冲突:
flutter clean
flutter pub get
flutter run --debug

5. 多设备兼容性测试

不同品牌Android 14设备的蓝牙权限、扫描机制存在差异,可在小米、华为、三星等设备上测试,排查是否为设备特定问题。

内容的提问来源于stack exchange,提问作者Stéphane de Luca

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 09:20:16