Android蓝牙扫描无法发现设备,如何将结果添加至TableLayout?
Android蓝牙扫描无结果排查解决步骤
1. 优先检查权限配置(90%以上的问题都是权限导致)
Android不同版本蓝牙扫描的权限要求不同,仅在AndroidManifest.xml静态声明无效,必须做动态权限申请:
- Android 6.0~Android 11(API 23~30):
- Manifest添加权限:
BLUETOOTH、BLUETOOTH_ADMIN、ACCESS_FINE_LOCATION - 代码中动态申请定位权限,同时必须打开系统的位置信息开关,否则扫描无结果
- Manifest添加权限:
- Android 12及以上(API 31+):
- Manifest添加权限:
BLUETOOTH_SCAN、BLUETOOTH_CONNECT、BLUETOOTH_ADMIN,其中BLUETOOTH_SCAN可以加android:usesPermissionFlags="neverForLocation"属性免除定位权限要求 - 代码中动态申请
BLUETOOTH_SCAN权限
部分国产ROM(小米、华为、OPPO等)还需要在系统应用设置中,给APP单独开启「蓝牙扫描」「位置信息」权限,可手动进入设置页确认权限已授予。
- Manifest添加权限:
2. 修正扫描启动时机
你当前代码的逻辑是请求开启蓝牙后立刻启动扫描,此时蓝牙还没完成开启流程,扫描请求会直接失效:
- 不要在
onCreate里直接调用startDiscovery(),要在onActivityResult中监听到用户同意开启蓝牙、蓝牙状态变为已开启之后,再执行扫描逻辑 - 启动扫描前先调用
bluetoothAdapter.cancelDiscovery()终止可能正在运行的扫描任务,避免冲突导致新扫描启动失败
3. 调整广播注册顺序
你当前的代码是先启动扫描,再注册广播接收器,扫描刚开始触发的ACTION_FOUND广播会因为还没注册接收器而丢失,正确顺序是先注册广播接收器,再启动扫描。
4. 区分扫描的蓝牙设备类型
BluetoothAdapter.startDiscovery()是经典蓝牙的扫描API,只能扫描到处于可发现状态的经典蓝牙设备:
- 如果你要扫描的是低功耗BLE蓝牙设备(现在大部分智能手环、IoT设备都是BLE类型),需要使用
BluetoothLeScanner的startScan()接口,经典扫描API无法识别BLE设备 - 系统自带的蓝牙扫描同时支持经典蓝牙和BLE蓝牙扫描,所以会出现系统能扫到、自己的代码扫不到的情况
5. 规避系统扫描限制
Android 7.0及以上对蓝牙扫描做了频次限制,30秒内最多只能触发5次扫描,超过频次的扫描请求会被系统直接拦截,不要在代码中频繁调用扫描启动接口。
内容的提问来源于stack exchange,提问作者TaihouKai
相关产品推荐
相关产品推荐

