uni-app 蓝牙模块问题 uni.stopBluetoothDevicesDiscovery和uni.closeBluetoothAdapter无法正确关闭蓝牙模块 仍在持续获取

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

uni-app 蓝牙模块问题 uni.stopBluetoothDevicesDiscovery和uni.closeBluetoothAdapter无法正确关闭蓝牙模块 仍在持续获取

测试过的手机

荣耀30pro HarmonyOS4.2.0
图片1
图片2

操作步骤

调用蓝牙试一下就知道

预期结果

uni.stopBluetoothDevicesDiscovery, uni.closeBluetoothAdapter 无法正确关闭蓝牙模块,还是在一直获取

实际结果

uni.stopBluetoothDevicesDiscovery, uni.closeBluetoothAdapter 无法正确关闭蓝牙模块,还是在一直获取

bug描述

我在调用 uni.stopBluetoothDevicesDiscovery, uni.closeBluetoothAdapter 后 uni.onBluetoothDeviceFound 还是会一直打印出蓝牙信息来

开发环境与项目信息

详情
产品分类 uniapp/App
PC开发环境操作系统 Windows
PC开发环境操作系统版本号 Windows 10 专业版22H2
HBuilderX类型 正式
HBuilderX版本号 4.29
手机系统 全部
手机厂商 荣耀
页面类型 vue
vue版本 vue3
打包方式 离线
项目创建方式 HBuilderX

1 回复

在uni-app开发中,如果你遇到uni.stopBluetoothDevicesDiscoveryuni.closeBluetoothAdapter无法正确关闭蓝牙模块的问题,可能是由于调用顺序、状态管理或异步处理不当导致的。下面是一个较为完整的示例代码,展示了如何正确管理蓝牙模块的生命周期,包括开启、发现和关闭蓝牙设备。

首先,确保你已经正确引入了uni-app的蓝牙API,并在manifest.json中配置了蓝牙权限。

// pages/bluetooth/bluetooth.vue
<template>
  <view>
    <button @click="openBluetoothAdapter">开启蓝牙</button>
    <button @click="startDiscovery" v-if="isBluetoothOpen">开始发现设备</button>
    <button @click="stopDiscoveryAndCloseAdapter" v-if="isDiscovering">停止发现并关闭蓝牙</button>
  </view>
</template>

<script>
export default {
  data() {
    return {
      isBluetoothOpen: false,
      isDiscovering: false,
    };
  },
  methods: {
    openBluetoothAdapter() {
      uni.openBluetoothAdapter({
        success: () => {
          this.isBluetoothOpen = true;
          console.log('蓝牙已开启');
        },
        fail: (err) => {
          console.error('开启蓝牙失败:', err);
        },
      });
    },
    startDiscovery() {
      uni.startBluetoothDevicesDiscovery({
        allowDuplicatesKey: false,
        success: () => {
          this.isDiscovering = true;
          console.log('开始发现设备');
          // 可以在这里监听设备发现事件
          uni.onBluetoothDeviceFound((device) => {
            console.log('发现设备:', device);
          });
        },
        fail: (err) => {
          console.error('开始发现设备失败:', err);
        },
      });
    },
    stopDiscoveryAndCloseAdapter() {
      uni.stopBluetoothDevicesDiscovery({
        success: () => {
          this.isDiscovering = false;
          console.log('已停止发现设备');
          uni.closeBluetoothAdapter({
            success: () => {
              this.isBluetoothOpen = false;
              console.log('蓝牙已关闭');
            },
            fail: (err) => {
              console.error('关闭蓝牙失败:', err);
            },
          });
        },
        fail: (err) => {
          console.error('停止发现设备失败:', err);
        },
      });
    },
  },
};
</script>

在这个示例中,我们定义了三个主要操作:开启蓝牙、开始发现设备和停止发现并关闭蓝牙。通过isBluetoothOpenisDiscovering两个状态变量来控制按钮的显示和隐藏,确保用户不会在不适当的状态下执行操作。

注意,uni.onBluetoothDeviceFound事件监听器用于在设备被发现时进行处理,确保即使在发现过程中,应用也能正确响应。在stopDiscoveryAndCloseAdapter方法中,我们首先调用uni.stopBluetoothDevicesDiscovery停止发现,然后再调用uni.closeBluetoothAdapter关闭蓝牙适配器,确保关闭操作按顺序执行。

如果问题仍然存在,请检查是否有其他异步操作干扰了蓝牙模块的关闭流程,或者尝试在不同的设备或系统版本上测试。

回到顶部