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

Android API 31升级后BleManager无法启动扫描求助

解决API 31下BleManager无法启动扫描的问题

当你将targetSdkVersion升级到31(对应Android 12)后,蓝牙扫描失败是因为系统新增了更严格的蓝牙权限管控,以下是具体修复步骤:

1. 更新AndroidManifest.xml权限

在android/app/src/main/AndroidManifest.xml中补充必要的权限配置:

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

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

<!-- 如果扫描不需要关联位置信息,添加该flag避免强制申请位置权限 -->
<uses-permission android:name="android.permission.BLUETOOTH_SCAN"
    android:usesPermissionFlags="neverForLocation" />

<!-- Android 11及以下版本,蓝牙扫描仍需位置权限 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" android:maxSdkVersion="30" />

<!-- 声明应用依赖蓝牙LE硬件 -->
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true" />

2. 动态申请权限

在React Native代码中,启动扫描前必须动态申请对应权限,避免权限缺失导致扫描失败:

import { PermissionsAndroid, Platform } from 'react-native';
import BleManager from 'react-native-ble-manager';

async function requestBlePermissions() {
  const requiredPermissions = [];
  if (Platform.OS === 'android') {
    if (Platform.Version >= 31) {
      // Android 12+ 需要申请新的蓝牙权限
      requiredPermissions.push(
        PermissionsAndroid.PERMISSIONS.BLUETOOTH_SCAN,
        PermissionsAndroid.PERMISSIONS.BLUETOOTH_CONNECT
      );
    } else {
      // 旧版本Android需要位置和蓝牙管理权限
      requiredPermissions.push(
        PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION,
        PermissionsAndroid.PERMISSIONS.BLUETOOTH_ADMIN
      );
    }
  }

  const grantResults = await PermissionsAndroid.requestMultiple(requiredPermissions);
  // 校验所有权限是否都已授予
  return Object.values(grantResults).every(result => result === PermissionsAndroid.RESULTS.GRANTED);
}

// 启动扫描前先校验权限
requestBlePermissions().then(isGranted => {
  if (isGranted) {
    BleManager.startScan([]);
  } else {
    console.error('蓝牙相关权限未授予,无法启动扫描');
  }
});

3. 升级BleManager库版本

确保你使用的react-native-ble-manager是支持Android 12的版本(建议v8.0.0及以上),执行以下命令更新:

npm install react-native-ble-manager@latest --save

4. 适配后台扫描限制(若需)

Android 12对后台蓝牙扫描做了限制,若你的应用需要在后台扫描,需额外添加ACCESS_BACKGROUND_LOCATION权限,同时确保扫描逻辑符合系统后台运行规范。

完成以上步骤后,重新编译运行应用,BleManager的扫描功能即可恢复正常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 10:30:50