- Android 12(API 级别 31)或更高版本引入了新的权限管理机制 - 官方给的答案在这里https://developer.android.com/develop/connectivity/bluetooth/bt-permissions?hl=zh-cn下边回答是解决办法(现在高版本的Android要用户授权)
- 找到你的android/app/src/main/AndroidManifest.xml文件改Install | react-native-ble-manager
- "react-native-ble-manager": "^11.3.2",更新你的包
- 在请求连接蓝牙的地方给他查有权限没,没权限就去授权react-native-ble-manager/example/components/ScanDevicesScreen.tsx at master · innoveit/react-native-ble-manager · GitHub 392行
export const handleAndroidPermissions = async () => { let permissionsStatus = false; // 初始值没权限 if (Platform.OS !== 'android') return permissionsStatus; 如果不是Android 我们就不需要整这个权限了 if (Platform.Version >= 31) { try { const result = await PermissionsAndroid.requestMultiple([ // 高版本申请权限 PermissionsAndroid.PERMISSIONS.BLUETOOTH_SCAN, PermissionsAndroid.PERMISSIONS.BLUETOOTH_CONNECT, ]); if (result['android.permission.BLUETOOTH_CONNECT'] === 'granted') {// 只能申请两次,如果两次都拒绝,就需要用户手动去给开蓝牙权限了 permissionsStatus = true; console.debug('[handleAndroidPermissions] User accepts runtime permissions android 12+'); } else { permissionsStatus = false; console.error('[handleAndroidPermissions] User refuses runtime permissions android 12+'); } } catch (error) { permissionsStatus = false; console.error('[handleAndroidPermissions] User refuses runtime permissions android 12+', error); } } else if (Platform.Version >= 23) {// 保证统一性,低版本也给他查权限,开权限 try { const requestResult = await PermissionsAndroid.request(PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION); if (requestResult) { permissionsStatus = true; console.debug('[handleAndroidPermissions] User accepts runtime permission android <12'); } else { permissionsStatus = false; console.error('[handleAndroidPermissions] User refuses runtime permission android <12'); } } catch (error) { console.error('[handleAndroidPermissions] User refuses runtime permission android <12'); } } return permissionsStatus; };
- 有权限以后把这个权限状态更新到redux里面
const openBLEPermission = useCallback(async () => { if (!bleAuthStatus) { const status = await handleAndroidPermissions(); dispatch(setBLEAuthStatus(status)); } }, [bleAuthStatus, dispatch]);
-
然后你根据自己需求,有权限以后再使用Ble就行,反正就是没权限之前不能动BLE,注意区分ios,别给ios整坏了