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

React Native Expo中如何调出蓝牙权限弹窗?代码调用未生效

在React Native Expo中正确调出蓝牙权限弹窗的方法

你当前使用原生PermissionsAndroid的方式在Expo环境下不生效,因为Expo有独立的权限管理体系,且蓝牙权限需要结合Expo官方的蓝牙模块和配置来处理,以下是正确的实现步骤:

1. 安装依赖

首先安装Expo蓝牙模块:

npx expo install expo-bluetooth

2. 配置app.json权限

在项目的app.json(或app.config.js)中添加安卓所需的蓝牙相关权限:

{
  "expo": {
    "android": {
      "permissions": [
        "BLUETOOTH_SCAN",
        "BLUETOOTH_CONNECT",
        "ACCESS_FINE_LOCATION" // Android 10+ 扫描蓝牙需位置权限
      ]
    }
  }
}

3. 编写权限申请函数

使用expo-bluetooth提供的requestPermissionsAsync方法替代原生PermissionsAndroid,该方法会自动弹出系统权限弹窗:

import * as Bluetooth from 'expo-bluetooth';

const askPermission = async () => {
  try {
    const permissionResult = await Bluetooth.requestPermissionsAsync();
    if (permissionResult.status === 'granted') {
      console.log('蓝牙权限已获取');
      // 后续可执行蓝牙扫描、连接等操作
    } else {
      console.log('蓝牙权限被拒绝');
      // 处理权限拒绝后的逻辑,比如提示用户手动开启权限
    }
  } catch (err) {
    console.error('申请权限失败:', err);
  }
};

4. 触发权限申请

可以在组件初始化时通过useEffect调用,或者绑定到按钮点击事件:

import { useEffect, Button } from 'react';
import { View } from 'react-native';

export default function App() {
  useEffect(() => {
    askPermission();
  }, []);

  return (
    <View>
      {/* 也可以用按钮手动触发 */}
      <Button title="申请蓝牙权限" onPress={askPermission} />
    </View>
  );
}

注意事项

  • Android 12及以上版本需要单独申请BLUETOOTH_SCAN和BLUETOOTH_CONNECT权限,expo-bluetooth会自动处理这些权限的申请流程。
  • 若需扫描蓝牙设备,Android 10及以上版本必须同时获取ACCESS_FINE_LOCATION权限,否则无法扫描到设备。
  • Expo环境下禁止混用原生PermissionsAndroid和Expo权限API,否则会出现权限申请不生效的问题。

内容的提问来源于stack exchange,提问作者Sumit Sharma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 22:05:05