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
相关产品推荐
相关产品推荐

