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

Android 12及以上版本React Native BLE扫描失败问题求助

Android 12+ React Native BLE扫描失败解决方案

1. 修正AndroidManifest.xml权限配置

Android 12(API 31)及以上版本对BLE权限做了细分,需补充权限属性适配不同场景:

<!-- 旧版本BLE权限(仅API 30及以下生效) -->
<uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" />

<!-- Android 12+ BLE核心权限 -->
<!-- 扫描无需关联位置时,添加neverForLocation flag以跳过位置权限依赖 -->
<uses-permission android:name="android.permission.BLUETOOTH_SCAN"
    android:usesPermissionFlags="neverForLocation" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<!-- 仅当扫描需基于位置过滤设备时保留,否则可移除 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" android:maxSdkVersion="30" />

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

2. 优化运行时权限申请逻辑

Android 12+需批量申请BLE相关权限,避免异步时序问题:

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

async function requestBLEPermissions() {
  let permissions = [];
  
  if (Platform.Version > 30) { // Android 12+
    permissions = [
      PermissionsAndroid.PERMISSIONS.BLUETOOTH_SCAN,
      PermissionsAndroid.PERMISSIONS.BLUETOOTH_CONNECT
    ];
    // 若需位置关联扫描,添加位置权限
    // permissions.push(PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION);
  } else { // Android 11及以下
    permissions = [PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION];
  }

  try {
    const granted = await PermissionsAndroid.requestMultiple(permissions);
    const allGranted = Object.values(granted).every(val => val === PermissionsAndroid.RESULTS.GRANTED);
    if (allGranted) {
      console.log('所有BLE权限已授予');
      SetPermission(true);
    } else {
      console.log('部分BLE权限被拒绝');
      SetPermission(false);
    }
  } catch (err) {
    console.warn(err);
    SetPermission(false);
  }
}

3. 适配BLE扫描代码(以react-native-ble-plx为例)

确保使用最新版BLE库,并调整扫描参数适配Android 12+:

import { BleManager, ScanMode } from 'react-native-ble-plx';

const manager = new BleManager();

async function startBLEScan() {
  try {
    await manager.startDeviceScan(null, {
      allowDuplicates: false,
      scanMode: ScanMode.LowLatency // Android 12+推荐低延迟扫描模式
    }, (error, device) => {
      if (error) {
        console.error('扫描错误:', error);
        return;
      }
      if (device) {
        console.log('发现设备:', device.name);
        // 处理扫描到的设备逻辑
      }
    });
  } catch (err) {
    console.error('启动扫描失败:', err);
  }
}

4. 其他排查点

  • 确认设备蓝牙已开启:可通过第三方库(如react-native-bluetooth-status)检测蓝牙状态,扫描前确保蓝牙激活。
  • 清理项目缓存:执行cd android && ./gradlew clean后重新编译项目。
  • 检查系统权限:在设备设置中确认应用已授予所有所需的BLE、位置权限。

内容的提问来源于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.01 17:40:24