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

React Native安卓端蓝牙权限返回unavailable,仅请求定位权限问题

React Native安卓蓝牙权限返回unavailable问题修复方案

问题核心原因

蓝牙权限BLUETOOTH_SCAN/BLUETOOTH_CONNECT返回unavailable且仅弹出位置权限请求,主要因Android版本适配缺失、权限声明未附加使用场景,以及权限请求逻辑未区分版本导致。

具体修复步骤

1. 完善AndroidManifest.xml权限声明

针对Android 12(API 31)及以上版本,蓝牙权限需添加使用场景声明;同时兼容低版本权限配置:

<uses-permission android:name="android.permission.INTERNET" />

<!-- Android 12+ 蓝牙权限 -->
<uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN"
    android:usesPermissionFlags="neverForLocation" />

<!-- 兼容Android 11及以下版本的蓝牙权限 -->
<uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" android:maxSdkVersion="30" />

注:android:usesPermissionFlags="neverForLocation"用于告知系统蓝牙扫描无需关联位置,避免强制触发位置权限请求。

2. 调整权限请求的版本适配逻辑

根据Android版本请求对应权限,避免跨版本请求无效权限:

import { Platform } from 'react-native';
import { requestMultiple, PERMISSIONS } from 'react-native-permissions';

const checkBluetoothPermissions = async () => {
  const permissionsToRequest = Platform.OS === 'android'
    ? Platform.Version >= 31
      ? [
          PERMISSIONS.ANDROID.BLUETOOTH_SCAN,
          PERMISSIONS.ANDROID.BLUETOOTH_CONNECT,
        ]
      : [
          PERMISSIONS.ANDROID.ACCESS_FINE_LOCATION,
          PERMISSIONS.ANDROID.BLUETOOTH,
          PERMISSIONS.ANDROID.BLUETOOTH_ADMIN,
        ]
    : [PERMISSIONS.IOS.BLUETOOTH_PERIPHERAL];

  const results = await requestMultiple(permissionsToRequest);
  console.log('permission results', results);
};

3. 清理并重建项目

执行以下命令清理gradle缓存并重新构建,确保权限配置生效:

cd android
./gradlew clean
./gradlew assembleDebug

4. 验证设备蓝牙状态

若设备蓝牙未开启,部分权限会返回unavailable,可在请求权限前先检查蓝牙状态:

// 以react-native-bluetooth-manager为例,根据你使用的蓝牙库调整
import { BluetoothManager } from 'react-native-bluetooth-manager';

const checkBluetoothState = async () => {
  const state = await BluetoothManager.getState();
  if (state !== 'PoweredOn') {
    // 提示用户开启蓝牙
    alert('请先开启设备蓝牙');
  }
};

额外注意事项

  • 测试需使用Android 12及以上设备,低版本权限逻辑不同
  • 确保应用targetSdkVersion设置为31或更高
  • 卸载旧版本应用后重新安装,避免缓存的权限配置干扰

内容的提问来源于stack exchange,提问作者Dylan Bozarth

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 20:52:47