uni-app 一加手机 OncPlus 8T 在app中只要进入使用蓝牙的页面每次都弹出询问是否同意使用蓝牙通知

uni-app 一加手机 OncPlus 8T 在app中只要进入使用蓝牙的页面每次都弹出询问是否同意使用蓝牙通知

操作步骤:

  • 进入蓝牙页面 -》 点击初始蓝牙 -》 弹框提示是否打开蓝牙 每次进都问 烦死了

预期结果:

  • 第一次进入app使用蓝牙时弹框提示, 后续搜索蓝牙不再提示

实际结果:

  • 每次都提示

bug描述:

  • 一加手机运行hello-uni项目时,每次进蓝牙页面点击搜索蓝牙适配器时都会弹出询问使用蓝牙的弹框
1 回复

更多关于uni-app 一加手机 OncPlus 8T 在app中只要进入使用蓝牙的页面每次都弹出询问是否同意使用蓝牙通知的实战教程也可以访问 https://www.itying.com/category-93-b0.html


这个问题是由于Android系统权限管理机制导致的。一加手机(基于Android系统)对蓝牙权限采用了运行时动态权限申请,且部分厂商系统在权限管理上较为严格。

核心原因:

  1. Android系统将蓝牙扫描归类为危险权限(ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATION),需要动态申请
  2. 一加手机系统可能未正确处理“永久拒绝”或“仅本次允许”的选项,导致每次都需要重新询问
  3. 部分Android厂商定制系统在权限缓存处理上存在差异

解决方案:

1. 检查权限状态(关键步骤) 在调用蓝牙API前,先检查权限状态:

// 检查是否已授权
uni.getSetting({
  success(res) {
    if (!res.authSetting['scope.bluetooth']) {
      // 未授权,需要申请
      uni.authorize({
        scope: 'scope.bluetooth',
        success() {
          // 授权成功,初始化蓝牙
          initBluetooth();
        }
      })
    } else {
      // 已授权,直接初始化
      initBluetooth();
    }
  }
})

2. 使用统一的权限管理 建议在App启动时或主页面统一申请蓝牙权限:

// App.vue 或首页
onLaunch() {
  this.checkBluetoothPermission();
}

methods: {
  checkBluetoothPermission() {
    uni.authorize({
      scope: 'scope.bluetooth',
      fail: () => {
        // 用户拒绝,可引导去设置页
        uni.showModal({
          title: '提示',
          content: '需要蓝牙权限才能使用相关功能',
          success: (res) => {
            if (res.confirm) {
              uni.openSetting();
            }
          }
        })
      }
    })
  }
}

3. 处理用户拒绝后的场景 如果用户选择“拒绝”,下次进入时需要特殊处理:

uni.getSetting({
  success(res) {
    if (res.authSetting['scope.bluetooth'] === false) {
      // 用户已拒绝,需要引导手动开启
      uni.showModal({
        title: '提示',
        content: '蓝牙权限已被拒绝,请在设置中开启',
        showCancel: false,
        success: () => {
          uni.openSetting();
        }
      })
      return;
    }
    // 正常流程
  }
})

4. 配置manifest.json 确保在manifest.json中正确声明权限:

{
  "app-plus": {
    "distribute": {
      "android": {
        "permissions": [
          "<uses-permission android:name=\"android.permission.BLUETOOTH\"/>",
          "<uses-permission android:name=\"android.permission.BLUETOOTH_ADMIN\"/>",
          "<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>"
        ]
      }
    }
  }
}
回到顶部