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

