开发蓝牙代码时,蓝牙适配器需重启才能搜索到设备的问题咨询
蓝牙BLE搜索故障排查方案
扫描前状态校验缺失
代码里没做蓝牙适配器状态和权限的前置校验,重启蓝牙相当于强制完成了适配器初始化流程,所以能正常扫描。建议在调用startScan前补充:// 校验蓝牙是否开启 if (!bluetoothAdapter.isEnabled()) { // 触发蓝牙开启请求或提示用户 return; } // Android 6.0+ 必须校验位置权限 if (ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { // 请求位置权限 return; }扫描过滤器可能存在匹配问题
你只过滤了单个Service UUID,如果目标设备未广播该UUID,或者UUID填写错误,就会被过滤掉。重启蓝牙后设备可能重新广播了UUID才被识别。可以先去掉过滤器测试:scanner.startScan(null, scanSettings, mLeScanCallback);如果能搜到设备,就说明过滤器的UUID配置有误,需要核对目标设备的实际广播UUID。
扫描资源未正确释放
若之前的扫描任务未停止就重复调用startScan,会导致扫描逻辑异常。重启蓝牙会清空旧任务,所以恢复正常。建议每次启动扫描前先停止旧扫描:if (scanner != null) { scanner.stopScan(mLeScanCallback); } // 再执行启动扫描的代码系统扫描缓存干扰
Android会缓存BLE扫描结果,若目标设备广播数据无变化,系统可能不会重复返回。可以在ScanSettings中强制实时返回结果:ScanSettings scanSettings = new ScanSettings.Builder() .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY) .setReportDelay(0) // 禁用延迟上报,实时返回结果 .build();
内容的提问来源于stack exchange,提问作者JRowan
相关产品推荐
相关产品推荐

