React Native中Android 12附近设备请求与权限检查方法
React Native实现Android 12附近设备功能及权限检查
一、配置Android权限
首先在android/app/src/main/AndroidManifest.xml中声明所需权限:
<!-- Android 12+ 附近设备核心权限 --> <uses-permission android:name="android.permission.BLUETOOTH_SCAN" /> <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" /> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /> <!-- 兼容Android 11及以下版本的位置权限(仅当需要通过蓝牙定位时添加) --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" android:maxSdkVersion="30" />
二、检查与请求权限
推荐使用react-native-permissions库简化权限管理:
- 安装依赖:
npm install react-native-permissions --save # 或使用yarn yarn add react-native-permissions
- 权限检查与请求代码示例:
import { Platform } from 'react-native'; import { check, requestMultiple, PERMISSIONS, RESULTS } from 'react-native-permissions'; import { PermissionsAndroid } from 'react-native'; // 检查Android 12+附近设备权限状态 const checkNearbyDevicesPermission = async () => { if (Platform.OS !== 'android' || Platform.Version < 31) return false; const [scanStatus, connectStatus] = await Promise.all([ check(PERMISSIONS.ANDROID.BLUETOOTH_SCAN), check(PERMISSIONS.ANDROID.BLUETOOTH_CONNECT) ]); return scanStatus === RESULTS.GRANTED && connectStatus === RESULTS.GRANTED; }; // 请求附近设备权限 const requestNearbyDevicesPermission = async () => { // 兼容Android 11及以下,请求位置权限 if (Platform.OS !== 'android' || Platform.Version < 31) { const granted = await PermissionsAndroid.request( PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION, { title: "位置权限请求", message: "应用需要位置权限以搜索附近蓝牙设备", buttonNegative: "取消", buttonPositive: "确定" } ); return granted === PermissionsAndroid.RESULTS.GRANTED; } const result = await requestMultiple([ PERMISSIONS.ANDROID.BLUETOOTH_SCAN, PERMISSIONS.ANDROID.BLUETOOTH_CONNECT ]); return result[PERMISSIONS.ANDROID.BLUETOOTH_SCAN] === RESULTS.GRANTED && result[PERMISSIONS.ANDROID.BLUETOOTH_CONNECT] === RESULTS.GRANTED; };
三、实现附近设备扫描功能
使用react-native-ble-plx库实现蓝牙设备扫描(React Native生态中常用的BLE处理库):
- 安装依赖:
npm install react-native-ble-plx --save # 或使用yarn yarn add react-native-ble-plx
- 扫描设备代码示例:
import { BleManager } from 'react-native-ble-plx'; // 初始化BLE管理器 const bleManager = new BleManager(); // 启动附近设备扫描 const startNearbyDeviceScan = async () => { // 先检查权限 let hasPermission = await checkNearbyDevicesPermission(); if (!hasPermission) { hasPermission = await requestNearbyDevicesPermission(); if (!hasPermission) { alert('请授予附近设备权限以继续扫描'); return; } } // 开始扫描,第一个参数为服务UUID(null表示扫描所有设备) bleManager.startDeviceScan(null, null, (error, device) => { if (error) { console.error('扫描出错:', error); bleManager.stopDeviceScan(); return; } if (device) { console.log('发现设备:', { name: device.name || '未知设备', id: device.id, rssi: device.rssi }); // 可在此处将设备信息存入状态,用于UI展示 } }); // 设置扫描超时,10秒后自动停止 setTimeout(() => { bleManager.stopDeviceScan(); console.log('扫描已停止'); }, 10000); };
注意事项
- 若应用不需要通过蓝牙获取位置信息,可在
BLUETOOTH_SCAN权限声明中添加android:usesPermissionFlags="neverForLocation",避免系统要求位置权限。 - 务必使用Android 12及以上的真机进行测试,模拟器通常不支持蓝牙功能。
内容的提问来源于stack exchange,提问作者HendyCrcs
相关产品推荐
相关产品推荐

