uni-app 在安卓13上需申请定位权限后才能搜到蓝牙

发布于 1周前 作者 yibo5220 来自 Uni-App

uni-app 在安卓13上需申请定位权限后才能搜到蓝牙

开发环境 版本号 项目创建方式
Windows 11 HBuilderX
### 操作步骤:

Android 13上, 不申请定位权限 就可以搜到蓝牙设备

### 预期结果:

Android 13上, 不申请定位权限 就可以搜到蓝牙设备

### 实际结果:

Android 13上, 不申请定位权限 就可以搜到蓝牙设备

### bug描述:

使用同一台电脑打包今天遇到的问题如下:  

1. 之前打包后, Android 13手机上, 申请"BLUETOOTH_SCAN"  "BLUETOOTH_CONNECT", 后就可以搜到蓝牙设备.  
2. 今天新打包后, 需要申请"ACCESS_FINE_LOCATION"后, 才能搜到蓝牙设备  
3. 使用的是云端证书  
4. 代码逻辑也没改动  
5. 唯一变化的是HBuilderX "3.8.12"升到了"3.96"  
请问应该如何解决?

3 回复

怎么解决的 佬

在 Android 13 及更高版本中,Google 引入了更严格的权限管理机制,特别是对于蓝牙和定位权限的处理。为了在 Android 13 上使用蓝牙功能,应用需要申请 ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATION 权限,因为蓝牙扫描可能会被用于推断设备的位置信息。

解决方案

  1. manifest.json 中声明权限: 在 uni-app 项目的 manifest.json 文件中,确保声明了以下权限:

    {
      "permissions": {
        "android": [
          "android.permission.BLUETOOTH",
          "android.permission.BLUETOOTH_ADMIN",
          "android.permission.ACCESS_FINE_LOCATION",
          "android.permission.ACCESS_COARSE_LOCATION"
        ]
      }
    }
  2. 动态申请定位权限: 在 Android 6.0(API 23)及以上版本中,应用需要在运行时动态申请权限。你可以在 uni-app 中使用 uni.authorizeuni.getSetting 来请求权限。

    示例代码:

    uni.authorize({
      scope: 'scope.userLocation',
      success() {
        console.log('定位权限已授权');
        // 开始蓝牙扫描
        startBluetoothScan();
      },
      fail() {
        console.log('定位权限未授权');
        // 提示用户需要授权定位权限
        uni.showModal({
          title: '提示',
          content: '需要授权定位权限才能使用蓝牙功能',
          success(res) {
            if (res.confirm) {
              uni.openSetting({
                success(settingRes) {
                  if (settingRes.authSetting['scope.userLocation']) {
                    console.log('定位权限已授权');
                    // 开始蓝牙扫描
                    startBluetoothScan();
                  }
                }
              });
            }
          }
        });
      }
    });
    
    function startBluetoothScan() {
      uni.startBluetoothDevicesDiscovery({
        success(res) {
          console.log('蓝牙扫描开始', res);
        },
        fail(err) {
          console.log('蓝牙扫描失败', err);
        }
      });
    }
  3. 处理权限拒绝的情况: 如果用户拒绝了定位权限,应用需要处理这种情况,并提示用户重新授权。可以通过 uni.openSetting 引导用户打开设置页面,手动开启权限。

注意事项

  • Android 13 的蓝牙权限:在 Android 13 中,Google 引入了 BLUETOOTH_SCANBLUETOOTH_CONNECT 权限,分别用于蓝牙扫描和连接。如果你的应用目标 SDK 版本为 Android 13 或更高,还需要声明这些权限。

    {
      "permissions": {
        "android": [
          "android.permission.BLUETOOTH_SCAN",
          "android.permission.BLUETOOTH_CONNECT",
          "android.permission.ACCESS_FINE_LOCATION",
          "android.permission.ACCESS_COARSE_LOCATION"
        ]
      }
    }
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!