目錄
效果展示
實(shí)現(xiàn)步驟
1.添加權(quán)限
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
2.檢測(cè)藍(lán)牙
/**
* 獲取藍(lán)牙BluetoothAdapter
*/
private fun initBluetooth() {
val bluetoothManager = getSystemService(BLUETOOTH_SERVICE) as BluetoothManager
bluetoothAdapter = bluetoothManager.adapter
}
/**
* 檢測(cè)是否支持藍(lán)牙
*/
private fun checkBluetooth() {
if(bluetoothAdapter == null){
ToastUtils.showShort("沒(méi)有藍(lán)牙")
return
}else{
ToastUtils.showShort("有藍(lán)牙")
openBluetooth()
}
}
假如獲取的BluetoothAdapter為null的話(huà)說(shuō)明設(shè)備不支持藍(lán)牙
3.開(kāi)啟藍(lán)牙
我們先通過(guò)BluetoothAdapter的isEnabled()方法判斷藍(lán)牙是否開(kāi)啟
/**
* 請(qǐng)求打開(kāi)藍(lán)牙
*/
private fun openBluetooth() {
bluetoothAdapter?.let {
if(!it.isEnabled){
ToastUtils.showShort("即將開(kāi)啟藍(lán)牙")
val openBluetoothIntent = Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE)
openBluetoothActivityForResult.launch(openBluetoothIntent)
}else{
ToastUtils.showShort("藍(lán)牙以開(kāi)啟")
}
}
}
如果沒(méi)有開(kāi)啟的話(huà)我們需要調(diào)用系統(tǒng)的開(kāi)啟藍(lán)牙的Activity钝计,并在onActivityResult中對(duì)結(jié)果進(jìn)行處理许溅,這里我們用最新的registerForActivityResult來(lái)調(diào)用(注意:這里的代碼需在上一個(gè)方法執(zhí)行前執(zhí)行)
/**
* 注冊(cè)請(qǐng)求開(kāi)啟藍(lán)牙的Launcher
*/
private fun registerActivityResultLauncher() {
openBluetoothActivityForResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result->
if (result.resultCode == RESULT_OK) {
ToastUtils.showShort("藍(lán)牙開(kāi)啟")
}else{
ToastUtils.showShort("未能開(kāi)啟")
}
}
}
4.掃描藍(lán)牙設(shè)備
掃描藍(lán)牙需要使用BluetoothAdapter的startDiscovery()方法玛迄,并且這里的掃描藍(lán)牙設(shè)備需要我們注冊(cè)廣播通過(guò)廣播來(lái)獲取掃描的設(shè)備
private val bluetoothScanBroadcastReceiver = object :BroadcastReceiver(){
@SuppressLint("NotifyDataSetChanged")
override fun onReceive(context: Context?, intent: Intent?) {
intent?.let {
when(it.action){
//開(kāi)始掃描
BluetoothAdapter.ACTION_DISCOVERY_STARTED->{
ToastUtils.showShort("開(kāi)始掃描")
LogUtils.eTag("藍(lán)牙","開(kāi)始掃描")
}
//掃描到設(shè)備
BluetoothDevice.ACTION_FOUND->{
it.getParcelableExtra<BluetoothDevice>(BluetoothDevice.EXTRA_DEVICE)?.let { device->
device.name?.let {
LogUtils.eTag("藍(lán)牙",device.name)
}
}
}
//掃描結(jié)束
BluetoothAdapter.ACTION_DISCOVERY_FINISHED->{
ToastUtils.showShort("掃描結(jié)束")
LogUtils.eTag("藍(lán)牙",deviceList)
}
else -> {
ToastUtils.showShort("其他")
LogUtils.eTag("藍(lán)牙","其他")
}
}
}
}
}
/**
* 注冊(cè)掃描藍(lán)牙的廣播
*/
private fun registerBluetoothScan() {
registerReceiver(bluetoothScanBroadcastReceiver, IntentFilter(BluetoothDevice.ACTION_FOUND))
registerReceiver(bluetoothScanBroadcastReceiver, IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_STARTED))
registerReceiver(bluetoothScanBroadcastReceiver, IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED))
}
/**
* 掃描藍(lán)牙
*/
@SuppressLint("NotifyDataSetChanged")
private fun scanBluetooth() {
bluetoothAdapter?.startDiscovery()
}
案例源碼
完整的代碼包括顯示掃描的設(shè)備列表的邏輯請(qǐng)下載源碼查看:https://gitee.com/itfitness/bluetooth-scan-device-demo