uni-app 蓝牙未开启调用连接蓝牙等方法无失败回调

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

uni-app 蓝牙未开启调用连接蓝牙等方法无失败回调

开发环境 版本号 项目创建方式
Windows 10 专业版 21H2 19044.3086 HBuilderX
产品分类:uniapp/App

PC开发环境操作系统:Windows

HBuilderX类型:正式

HBuilderX版本号:3.96

手机系统:Android

手机系统版本号:Android 11

手机厂商:斯科 (PDA手持机)

手机机型:C72

页面类型:vue

vue版本:vue3

打包方式:云端

项目创建方式:HBuilderX

示例代码:

```javascript
uni.openBluetoothAdapter({  
  success(res) {  
    resolve(res)  
  },  
  fail(err) {  
    reject(err)  
    uni.showModal({  
      title: '提示',  
      content: '使用该功能请开启蓝牙 !',  
      showCancel: false,  
    })  
  },  
})

export function connectBluetooth(val) {  
  return new Promise((resolve, reject) => {  
    uni.showLoading({  
      title: '连接中...',  
      mask: true,  
    })  
    const timeout = setTimeout(() => {  
      uni.hideLoading()  
      uni.showToast({  
        icon: 'none',  
        title: '连接超时,请检查蓝牙是否可用 !',  
      })  
    }, 10000)  
    uni.createBLEConnection({  
      deviceId: val, //设备id  
      success: (res) => {  
        uni.hideLoading()  
        clearTimeout(timeout)  
        uni.stopBluetoothDevicesDiscovery({  
          success: () => {  
            resolve('连接成功参数:' + JSON.stringify(res))  
          },  
        })  
      },  
      fail: (err) => {  
        uni.hideLoading()  
        clearTimeout(timeout)  
        uni.showModal({  
          title: '提示',  
          content: '蓝牙连接失败 !',  
          showCancel: false,  
        })  
        reject('连接失败:' + err)  
      },  
    })  
  })  
}

操作步骤: 第一步:init蓝牙 第二步:搜索蓝牙 第三步:在搜索或者连接蓝牙的时候关闭系统蓝牙 (此时蓝牙相关API除了初始化蓝牙有错误回调 其他都没有)

预期结果: 在未开启蓝牙的时候调用蓝牙相关API 请添加上错误回调

实际结果: 在未开启蓝牙的时候调用蓝牙相关API 没有任何提示与回调事件

bug描述: 在蓝牙初始化的uni.openBluetoothAdapter方法中 未开启蓝牙会进入fail(错误)回调中 既然如此 为什么当我未开启蓝牙调用uni.createBLEConnection等API时 成功和失败都未进入三个回调中的任意一个 让我判断他是否能正常连接或者是因为什么问题不能连接 既然未开启蓝牙调用uni.openBluetoothAdapter方法 会有错误回调 那么在蓝牙的每一个方法都应该存在 这是在实现系统健壮性必须要有的


2 回复

各位麻烦看看 谢谢


在使用 uni-app 进行蓝牙开发时,如果蓝牙未开启,调用连接蓝牙等方法时没有失败回调,可能是由于以下原因:

1. 平台差异

不同平台(如 iOS 和 Android)对蓝牙 API 的实现可能存在差异。某些平台在蓝牙未开启时可能不会触发失败回调,而是直接忽略操作或抛出异常。

2. 未正确处理蓝牙状态

在调用蓝牙相关方法之前,应该先检查蓝牙是否已开启。如果蓝牙未开启,可以提示用户开启蓝牙,而不是直接调用连接蓝牙等方法。

3. 未监听蓝牙状态变化

可以通过监听蓝牙状态变化来获取蓝牙的开启和关闭状态,从而在蓝牙未开启时进行相应的处理。

解决方案

1. 检查蓝牙状态

在调用蓝牙相关方法之前,先检查蓝牙是否已开启:

uni.openBluetoothAdapter({
  success(res) {
    console.log('蓝牙适配器已打开');
    // 在这里调用连接蓝牙等方法
  },
  fail(err) {
    console.log('蓝牙适配器打开失败', err);
    // 提示用户开启蓝牙
  }
});

2. 监听蓝牙状态变化

可以通过监听蓝牙状态变化来获取蓝牙的开启和关闭状态:

uni.onBluetoothAdapterStateChange(function(res) {
  console.log('蓝牙适配器状态变化', res);
  if (res.available) {
    console.log('蓝牙已开启');
  } else {
    console.log('蓝牙已关闭');
    // 提示用户开启蓝牙
  }
});

3. 处理蓝牙未开启的情况

在调用连接蓝牙等方法时,如果蓝牙未开启,可以提示用户开启蓝牙:

uni.getBluetoothAdapterState({
  success(res) {
    if (res.available) {
      console.log('蓝牙已开启');
      // 在这里调用连接蓝牙等方法
    } else {
      console.log('蓝牙未开启');
      // 提示用户开启蓝牙
    }
  },
  fail(err) {
    console.log('获取蓝牙适配器状态失败', err);
  }
});
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!