Android应用蓝牙扫描无法搜索到手机蓝牙设备问题求助
问题根因
你当前使用的BluetoothLeScanner仅支持扫描*低功耗蓝牙(BLE)*设备,你能搜到的智能家电均属于BLE设备,而开启可发现模式的手机默认广播的是经典蓝牙(BR/EDR)信号,不会被BLE扫描接口捕获,这是扫描不到手机的核心原因。
系统自带的蓝牙扫描功能会同时执行经典蓝牙扫描+BLE扫描,因此可以正常发现手机。
解决步骤
1. 补充经典蓝牙扫描逻辑
你需要注册广播接收器监听系统的经典蓝牙设备发现广播,再主动触发经典蓝牙扫描,示例代码如下:
// 注册广播接收器接收经典蓝牙扫描结果 private val bluetoothReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { when(intent?.action) { // 扫到新的经典蓝牙设备时触发 BluetoothDevice.ACTION_FOUND -> { val device = intent.getParcelableExtra<BluetoothDevice>(BluetoothDevice.EXTRA_DEVICE) val deviceName = device?.name val deviceAddress = device?.address Log.d(TAG, "找到经典蓝牙设备:名称$deviceName, 地址$deviceAddress") } // 扫描结束时触发 BluetoothAdapter.ACTION_DISCOVERY_FINISHED -> { Log.d(TAG, "经典蓝牙扫描结束") } } } } // 页面初始化时注册广播 val filter = IntentFilter().apply { addAction(BluetoothDevice.ACTION_FOUND) addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED) } registerReceiver(bluetoothReceiver, filter) // 启动经典蓝牙扫描 val bluetoothAdapter = BluetoothAdapter.getDefaultAdapter() if (bluetoothAdapter.isEnabled) { // 若之前正在扫描先取消,避免冲突 if (bluetoothAdapter.isDiscovering) { bluetoothAdapter.cancelDiscovery() } bluetoothAdapter.startDiscovery() }
2. 权限补全(针对Android 12及以上版本)
如果你的应用targetSdkVersion >= 31,需要在AndroidManifest.xml中补充以下权限,且需要动态申请:
<!-- Android 12+ 蓝牙扫描、连接权限 --> <uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" /> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /> <!-- 原有定位权限保留,兼容低版本系统 -->
3. 注意事项
- 经典蓝牙扫描和BLE扫描可以同时运行,二者返回的
BluetoothDevice格式统一,可合并处理 BluetoothAdapter.startDiscovery()是耗电操作,系统默认会在12秒后自动终止扫描,也可主动调用cancelDiscovery()提前结束- 扫描前请确认蓝牙已开启,且所有运行时权限均已被用户授权
内容的提问来源于stack exchange,提问作者Vladimir Fisher
相关产品推荐
相关产品推荐

