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

Flutter中esc_pos_bluetooth在Android10+启动扫描报错求助

解决Android 10+设备使用esc_pos_bluetooth扫描报错的问题

问题根源

报错提示缺少BLUETOOTH_SCAN权限且仅Android 10及以上设备出现问题,核心原因有两点:

  • Android从API 29(Android10)开始收紧蓝牙扫描权限管控,仅在Manifest中声明权限无法生效,必须动态申请运行时权限
  • 你的Manifest权限配置存在格式错误(如android: name多了空格,应为android:name),且部分权限的版本适配逻辑有误

具体修复步骤

1. 修正AndroidManifest.xml的权限配置

替换现有权限声明为以下内容,确保格式规范且版本适配准确:

<!-- 适配Android 9及以下的旧版蓝牙权限 -->
<uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" />

<!-- Android 10-11(API29-30)扫描蓝牙需位置权限 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" android:maxSdkVersion="30" />

<!-- Android 12+(API31)专属蓝牙权限 -->
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" tools:targetApi="31" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" tools:targetApi="31" />

<!-- 可选:若无需通过蓝牙扫描获取位置,添加此属性简化权限申请 -->
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" tools:targetApi="31" />

2. 动态申请运行时权限

仅靠Manifest声明权限不够,必须在代码中根据系统版本动态申请对应权限:

  • 先在pubspec.yaml添加权限处理依赖:
    dependencies:
      permission_handler: ^10.2.0 # 或使用最新稳定版
    
  • 在执行蓝牙扫描前添加权限检查逻辑:
    import 'package:permission_handler/permission_handler.dart';
    import 'package:esc_pos_bluetooth/esc_pos_bluetooth.dart';
    import 'package:device_info_plus/device_info_plus.dart';
    
    Future<void> checkPermissionsAndStartScan() async {
      PermissionStatus status;
      if (Platform.isAndroid) {
        final androidInfo = await DeviceInfoPlugin().androidInfo;
        if (androidInfo.version.sdkInt >= 31) {
          // Android 12+:申请BLUETOOTH_SCAN权限
          status = await Permission.bluetoothScan.request();
        } else if (androidInfo.version.sdkInt >= 29) {
          // Android 10-11:申请前台位置权限
          status = await Permission.locationWhenInUse.request();
        } else {
          // Android 9及以下:Manifest权限已足够
          status = PermissionStatus.granted;
        }
      } else {
        status = PermissionStatus.granted;
      }
    
      if (status.isGranted) {
        // 权限通过,执行扫描
        final PrinterBluetoothManager manager = PrinterBluetoothManager();
        manager.startScan(const Duration(seconds: 4));
        // 后续扫描结果处理逻辑...
      } else {
        // 权限被拒绝,引导用户前往设置开启
        openAppSettings();
      }
    }
    

3. 检查插件版本兼容性

确保esc_pos_bluetooth为最新稳定版,旧版本可能未适配Android 10+的权限体系,在pubspec.yaml中指定最新版本:

dependencies:
  esc_pos_bluetooth: ^0.2.2 # 或使用最新稳定版

4. 额外注意事项

  • 若需在后台执行蓝牙扫描,Android 10+还需申请ACCESS_BACKGROUND_LOCATION权限(仅必要时添加)
  • 禁止在权限未通过时直接调用扫描方法,否则会触发平台异常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 18:32:28