藍(lán)牙掃描的目的在于發(fā)現(xiàn)設(shè)備或者接收設(shè)備廣播轰枝,設(shè)備包括經(jīng)典藍(lán)牙設(shè)備和BLE藍(lán)牙設(shè)備,這兩種設(shè)備的掃描方式不同组去。
經(jīng)典藍(lán)牙設(shè)備
對于經(jīng)典藍(lán)牙設(shè)備鞍陨,掃描是通過調(diào)用startDiscovery接口,返回的結(jié)果是通過BroadcastReceiver接收的,可以獲取設(shè)備MAC地址诚撵,名稱以及RSSI缭裆。
startDiscovery是個異步調(diào)用,會立即返回寿烟。如果不調(diào)用cancelDiscovery主動停止掃描的話澈驼,最多掃描12s。
廣播主要監(jiān)聽以下幾個Action:
BluetoothDevice.ACTION_FOUND
BluetoothAdapter.ACTION_DISCOVERY_STARTED
BluetoothAdapter.ACTION_DISCOVERY_FINISHED
另外要注意startDiscovery返回的設(shè)備不包括已配對設(shè)備筛武,如要獲取已配對設(shè)備缝其,需要額外調(diào)用getBondedDevices。
BLE藍(lán)牙設(shè)備
對于BLE藍(lán)牙設(shè)備徘六,掃描是通過調(diào)用startLeScan接口内边,返回的結(jié)果是通過onLeScan回調(diào),除了獲得設(shè)備MAC地址硕噩,名稱及RSSI之外還能獲取設(shè)備廣播假残,廣播是以byte數(shù)組的形式表示的。
較新的Android版本提供了新的掃描接口炉擅,可更靈活地配置掃描策略辉懒,詳情可參考官網(wǎng)文檔,此處不再贅述谍失。
要注意的問題
一眶俩,需要打開以下權(quán)限
android.permission.BLUETOOTH
android.permission.ACCESS_COARSE_LOCATION
android.permission.BLUETOOTH_ADMIN
android.permission.ACCESS_FINE_LOCATION
另外還要注意動態(tài)權(quán)限問題,在Android 6.0(targetSdkVersion>=23)之后快鱼,需要動態(tài)申請獲取用戶位置的權(quán)限颠印,不然獲取不到設(shè)備掃描結(jié)果。
二抹竹,startDiscovery在大多數(shù)手機上是可以同時發(fā)現(xiàn)經(jīng)典藍(lán)牙和Ble的线罕,但是startDiscovery的回調(diào)無法返回BLE的廣播,所以無法通過廣播識別設(shè)備窃判,且startDiscovery掃描BLE的效率比startLeScan低很多钞楼。所以在實際應(yīng)用中,還是startDiscovery和startLeScan分開掃袄琳,前者掃經(jīng)典藍(lán)牙询件,后者掃低功耗藍(lán)牙。
三唆樊,startLeScan() 的時候宛琅,在onLeScan() 中不能做耗時操作,特別是周圍的BLE設(shè)備多的時候逗旁,容易導(dǎo)致底層堵塞嘿辟,如果有耗時操作請丟到子線程中去處理。如解析廣播識別設(shè)備等操作可能會較耗時。
四红伦,實踐中發(fā)現(xiàn)同樣一個設(shè)備介陶,有的手機很容易就掃出來了,有的手機很難掃出來色建。這種情況建議可以多掃幾次,每次掃描時間短一點舌缤。