Android蓝牙扫描

蓝牙扫描的目的在于发现设备或者接收设备广播,设备包括经典蓝牙设备和BLE蓝牙设备,这两种设备的扫描方式不同。

经典蓝牙设备

对于经典蓝牙设备,扫描是通过调用startDiscovery接口,返回的结果是通过BroadcastReceiver接收的,可以获取设备MAC地址,名称以及RSSI。

startDiscovery是个异步调用,会立即返回。如果不调用cancelDiscovery主动停止扫描的话,最多扫描12s。

广播主要监听以下几个Action:

BluetoothDevice.ACTION_FOUND

BluetoothAdapter.ACTION_DISCOVERY_STARTED

BluetoothAdapter.ACTION_DISCOVERY_FINISHED

另外要注意startDiscovery返回的设备不包括已配对设备,如要获取已配对设备,需要额外调用getBondedDevices。

BLE蓝牙设备

对于BLE蓝牙设备,扫描是通过调用startLeScan接口,返回的结果是通过onLeScan回调,除了获得设备MAC地址,名称及RSSI之外还能获取设备广播,广播是以byte数组的形式表示的。

较新的Android版本提供了新的扫描接口,可更灵活地配置扫描策略,详情可参考官网文档,此处不再赘述。

要注意的问题

一,需要打开以下权限

android.permission.BLUETOOTH

android.permission.ACCESS_COARSE_LOCATION

android.permission.BLUETOOTH_ADMIN

android.permission.ACCESS_FINE_LOCATION

另外还要注意动态权限问题,在Android 6.0(targetSdkVersion>=23)之后,需要动态申请获取用户位置的权限,不然获取不到设备扫描结果。

二,startDiscovery在大多数手机上是可以同时发现经典蓝牙和Ble的,但是startDiscovery的回调无法返回BLE的广播,所以无法通过广播识别设备,且startDiscovery扫描BLE的效率比startLeScan低很多。所以在实际应用中,还是startDiscovery和startLeScan分开扫,前者扫经典蓝牙,后者扫低功耗蓝牙。

三,startLeScan() 的时候,在onLeScan() 中不能做耗时操作,特别是周围的BLE设备多的时候,容易导致底层堵塞,如果有耗时操作请丢到子线程中去处理。如解析广播识别设备等操作可能会较耗时。

四,实践中发现同样一个设备,有的手机很容易就扫出来了,有的手机很难扫出来。这种情况建议可以多扫几次,每次扫描时间短一点。

你可能感兴趣的:(Android蓝牙扫描)