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

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库简化权限管理:

  1. 安装依赖:
npm install react-native-permissions --save
# 或使用yarn
yarn add react-native-permissions
  1. 权限检查与请求代码示例:
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处理库):

  1. 安装依赖:
npm install react-native-ble-plx --save
# 或使用yarn
yarn add react-native-ble-plx
  1. 扫描设备代码示例:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 15:30:53