uni-app 蓝牙模块能打开但完全搜索不到设备

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

uni-app 蓝牙模块能打开但完全搜索不到设备

开发环境 版本号 项目创建方式
Windows win11 HBuilderX

产品分类:uniapp/App

PC开发环境操作系统:Windows

HBuilderX类型:正式

HBuilderX版本号:3.99

手机系统:Android

手机系统版本号:Android 12

手机厂商:不止一台,能拿到的手机都试了

手机机型:不止一台

页面类型:vue

vue版本:vue2

打包方式:云端

示例代码:

uni.openBluetoothAdapter({  
    success:(res)=>{
        console.log('蓝牙模块打开成功')  
        uni.startBluetoothDevicesDiscovery({  
          success(res) {  
              console.log('startBluetoothDevicesDiscovery:')  
            console.log(res)//{"errMsg":"startBluetoothDevicesDiscovery:ok"}    
          }  
        })  
        uni.onBluetoothDeviceFound(function (devices) {  
            console.log('检索到的蓝牙设备:')  
            console.dir(devices)    //这里完全就是个空的  
        })  

        setTimeout(()=>{
            uni.getBluetoothAdapterState({  
              success(res) {  
                console.log(res)  
                /* 这个打印出来是:  
                {  
                    "discovering": true,  
                    "available": true,  
                    "errMsg": "getBluetoothAdapterState:ok"  
                } */  
              }  
            })  
        }, 1000)  
    },  
    fail:(res)=>{
        console.log('蓝牙模块打开失败',res)  
    },  
    complete:(e) =>{
        console.log('complete:')  
        console.log(e)//{"errMsg":"openBluetoothAdapter:ok"}   
    }  
})

操作步骤:

  • 直接在onLoad里面运行上面的代码

预期结果:

  • 打印出搜索到的蓝牙设备列表

实际结果:

  • 完全搜索不到

bug描述:

  • 用hbuilder云打包的app和直接用hbuilder连手机调试,createBLEConnection始终连接不上,后来尝试startBluetoothDevicesDiscovery直接检索蓝牙列表,发现也检索不出来(手机蓝牙和其他蓝牙软件都能查到),干脆新建了一个工程,单纯的就是检索蓝牙列表,也是空的,感觉完全搜索不到蓝牙设备了。(用getBluetoothAdapterState查了下状态都正常)
  • 定位也都开了的。。。权限也有
  • 代码和打印信息如图。

35 回复

有人能解决一下吗?


用手机自带的蓝牙连接了蓝牙后,搜索不到

uni.startBluetoothDevicesDiscovery({
success(res) {
// console.log(‘开始搜索’, res);
uni.onBluetoothDeviceFound(function(el) {
// console.log(‘找到蓝牙名字:’,el, el.devices[0].name);
})
},
fail(err) {
console.log(‘搜索失败’, err)
},
})

谢谢,这样试过了的,一样的,完全搜索不到。

有官方技术人员支持吗?真的是按文档最简单搜索列表都出不来啊

。。。。有人理理吗?

我还没有 用过 uni 写过 蓝牙 要不要 在 微信小程序里 试试, 看看 微信小程序的 文档, 如果可以的话 , 那可能 就是 uni 在app端有点bug

回复 3***@qq.com: 微信小程序是可以的,最开始就是同一套代码,在微信小程序里面没问题,后来要做app,就把那段代码拷过来,wx.改成uni.,然后离线打包也没问题的。但后来因为加了高德地图,离线打包出错,就改成了云打包,然后就发现蓝牙就不行了。。。所以后来为了测试我就建了这个项目做个简单的蓝牙搜索,才发现直接用hbuilder手机调试也是连搜索蓝牙都不行了。。。

有技术人员能看看吗?真的就是最简单的搜蓝牙列表,手机也开了定位,自己实在想不出还有什么别的能尝试的办法了。

有技术人员能解答一下吗?uniapp还有技术人员维护吗?

。。。uniapp还有维护的吗?

给app开关一下附件设备权限就能搜到,这个bug是uni-app现在会自动获取附件设备权限,但又不能用

看了下,附近设备的权限给了的。。。是试了好几台安卓机,都这样

回复 1***@qq.com: 附近设备权限先关掉,在开启

回复 4***@qq.com: 试了下,还是不行T_T

位置权限给了么,定位功能开了吗

都打开了的

uniapp只支持ble的蓝牙 可能你的是spp经典蓝牙 所以搜索不到

都是ble蓝牙,以前都可以的,以前用本地打包都没问题,这次是直接用hbuild调试和离线打包就不行了。。。同样的代码,微信小程序能搜到周边的蓝牙设备

对了设置的权限: [ “<uses-permission android:name=“android.permission.CALL_PHONE”/>”, “<uses-permission android:name=“android.permission.CAMERA”/>”, “<uses-feature android:name=“android.hardware.camera”/>”, “<uses-feature android:name=“android.hardware.camera.autofocus”/>”, “<uses-permission android:name=“android.permission.ACCESS_COARSE_LOCATION”/>”, “<uses-permission android:name=“android.permission.ACCESS_FINE_LOCATION”/>”, “<uses-permission android:name=“android.permission.ACCESS_LOCATION_EXTRA_COMMANDS”/>”, “<uses-permission android:name=“android.permission.ACCESS_MOCK_LOCATION”/>”, “<uses-permission android:name=“android.permission.ACCESS_NETWORK_STATE”/>”, “<uses-permission android:name=“android.permission.ACCESS_WIFI_STATE”/>”, “<uses-permission android:name=“android.permission.BLUETOOTH”/>”, “<uses-permission android:name=“android.permission.BLUETOOTH_ADMIN”/>”, “<uses-permission android:name=“android.permission.BLUETOOTH_PRIVILEGED”/>”, “<uses-permission android:name=“android.permission.CHANGE_NETWORK_STATE”/>”, “<uses-permission android:name=“android.permission.CHANGE_WIFI_STATE”/>”, “<uses-permission android:name=“android.permission.FLASHLIGHT”/>”, “<uses-permission android:name=“android.permission.MOUNT_UNMOUNT_FILESYSTEMS”/>”, “<uses-permission android:name=“android.permission.GET_ACCOUNTS”/>”, “<uses-permission android:name=“android.permission.READ_LOGS”/>”, “<uses-permission android:name=“android.permission.READ_PHONE_STATE”/>”, “<uses-permission android:name=“android.permission.VIBRATE”/>”, “<uses-permission android:name=“android.permission.WAKE_LOCK”/>”, “<uses-permission android:name=“android.permission.WRITE_SETTINGS”/>”, “<uses-permission android:name=“android.permission.WRITE_EXTERNAL_STORAGE”/>”, “<uses-permission android:name=“android.permission.REQUEST_INSTALL_PACKAGES”/>”, “<uses-permission android:name=“android.permission.INTERNET”/>” ]

app模块 勾选了吗? BLUETOOTH_SCAN 这个可以加下

回复 沐子鱼: android.permission.BLUETOOTH_SCAN 这个吗?刚刚加了,也一样。。。app模块里面也勾选了低功耗蓝牙的。

回复 1***@qq.com: 用的标准基座吗?自定义的话 要重新打的

回复 沐子鱼: 这个测试项目是用的标准基座

有技术人员能解答一下吗?

看下位置信息是否打开 ble需要打开位置信息 才能检索到

回复 沐子鱼: 位置信息权限打开了的

那就不知道了。。。

回复 沐子鱼: 请问你们手机直接用云打包或者hbuilder调试蓝牙这块没问题吗?

回复 1***@qq.com: 我碰到 没搜索到的情况 就几种 1.蓝牙是spp模式非ble 2.位置信息权限未打开 其它没碰到过了 3.当然会用比的蓝牙调试工具测试,如果还是未搜到直接找蓝牙提供商解决

回复 沐子鱼: 谢谢。我们是ble蓝牙,位置信息也都开了,而且办公室好多蓝牙设备,现在是一个设备都搜不出,几台手机同时测了都这样,所以很奇怪,但是离线打包的话可以,感觉是权限问题,但比较了一下权限又都给了,实在是自己找不出原因了。。。

targetSdk是多少

没有设置targetSdk,示例代码的这个目前还只是用hbuilder调试就发现不行。

在开发使用uni-app进行蓝牙设备搜索时,如果遇到蓝牙模块能打开但完全搜索不到设备的问题,这通常涉及多个方面的排查。以下是一个基于uni-app蓝牙API使用的代码示例以及一些可能的排查思路,希望能帮助你定位问题。

代码示例

首先,确保你已经在manifest.json中配置了蓝牙权限。

"mp-weixin": { // 示例为微信小程序配置,其他平台类似
  "appid": "your-app-id",
  "setting": {
    "bluetooth": true
  }
}

接着,在你的uni-app项目中,可以按照以下步骤进行蓝牙操作:

  1. 初始化蓝牙适配器
uni.openBluetoothAdapter({
  success: function(res) {
    console.log('蓝牙适配器初始化成功', res);
    startDiscovery();
  },
  fail: function(err) {
    console.error('蓝牙适配器初始化失败', err);
  }
});
  1. 开始搜索蓝牙设备
function startDiscovery() {
  uni.startBluetoothDevicesDiscovery({
    allowDuplicatesKey: false,
    success: function(res) {
      console.log('开始搜索蓝牙设备', res);
      
      // 监听找到新设备的事件
      uni.onBluetoothDeviceFound(function(devices) {
        devices.devices.forEach(device => {
          console.log('找到蓝牙设备', device);
        });
      });
    },
    fail: function(err) {
      console.error('搜索蓝牙设备失败', err);
    },
    complete: function() {
      // 停止搜索
      setTimeout(() => {
        uni.stopBluetoothDevicesDiscovery({
          success: function() {
            console.log('停止搜索蓝牙设备');
          }
        });
      }, 10000); // 例如,搜索10秒后停止
    }
  });
}

排查思路

  1. 权限问题:确保应用有蓝牙权限,并且在设备设置中蓝牙是开启的。

  2. 设备兼容性:某些设备可能不支持被其他设备发现,或者蓝牙版本不兼容。

  3. 蓝牙状态:在调用搜索之前,确保蓝牙适配器已经成功初始化。

  4. API调用顺序:严格按照API文档的顺序调用,如先初始化再搜索。

  5. 错误处理:仔细查看控制台输出的错误信息,可能会有更具体的失败原因。

  6. 设备名称或MAC:如果知道目标设备的名称或MAC地址,可以尝试直接连接而不是搜索。

通过上述代码示例和排查思路,你应该能够定位问题所在。如果问题依旧存在,建议查看uni-app的官方文档或社区论坛,看看是否有其他开发者遇到并解决了类似的问题。

回到顶部