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

flutter_bluetooth_serial 0.4.0在Android 12上无法运行的问题求助

Android 12下flutter_bluetooth_serial 0.4.0适配问题解决方案

从报错日志能看出两个核心问题:

  1. 权限缺失:Android 12新增了BLUETOOTH_CONNECT权限,旧版本插件未适配该权限,导致启动蓝牙时触发SecurityException
  2. 插件逻辑bug:权限请求回调时出现Reply already submitted崩溃,是插件重复向MethodChannel发送回复导致的

解决步骤:

1. 补充AndroidManifest权限

打开android/app/src/main/AndroidManifest.xml,添加Android 12+所需的蓝牙权限,同时保留低版本兼容权限:

<!-- Android 12及以上蓝牙连接权限 -->
<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" />

2. 动态申请蓝牙连接权限

在Flutter代码中,针对Android 12+版本,必须主动请求BLUETOOTH_CONNECT权限后,再执行蓝牙相关操作:

import 'package:permission_handler/permission_handler.dart';
import 'package:flutter/foundation.dart' show kIsWeb;
import 'package:device_info_plus/device_info_plus.dart';

// 检查并申请蓝牙连接权限
Future<bool> checkBluetoothConnectPermission() async {
  if (!kIsWeb && defaultTargetPlatform == TargetPlatform.android) {
    final androidDeviceInfo = await DeviceInfoPlugin().androidInfo;
    if (androidDeviceInfo.version.sdkInt >= 31) {
      final permissionStatus = await Permission.bluetoothConnect.request();
      return permissionStatus.isGranted;
    }
  }
  return true;
}

// 调用示例:开启蓝牙前先校验权限
void enableBluetooth() async {
  bool hasPermission = await checkBluetoothConnectPermission();
  if (hasPermission) {
    await FlutterBluetoothSerial.instance.requestEnable();
  }
}

需要在pubspec.yaml中添加依赖:

dependencies:
  permission_handler: ^10.2.0
  device_info_plus: ^9.0.0

3. 修复Reply already submitted崩溃

flutter_bluetooth_serial 0.4.0版本未适配Android 12权限逻辑,导致重复回复MethodChannel调用,可通过以下方式解决:

  • 优先升级插件:查看插件最新版本是否已修复该问题,若有则直接升级到最新版
  • 替换插件:如果该插件长期未维护,可更换为flutter_blue_plus这类适配Android 12+的蓝牙插件
  • 手动修改源码:若无法升级/替换,可修改插件的FlutterBluetoothSerialPlugin.java文件,在onActivityResult方法中添加判断,避免重复调用result.success()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 01:17:04