Android藍(lán)牙(一):設(shè)備的掃描

目錄

效果展示

實(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("沒有藍(lán)牙")
            return
        }else{
            ToastUtils.showShort("有藍(lán)牙")
            openBluetooth()
        }
    }

假如獲取的BluetoothAdapter為null的話說明設(shè)備不支持藍(lán)牙

3.開啟藍(lán)牙

我們先通過BluetoothAdapter的isEnabled()方法判斷藍(lán)牙是否開啟

/**
     * 請(qǐng)求打開藍(lán)牙
     */
    private fun openBluetooth() {
        bluetoothAdapter?.let {
            if(!it.isEnabled){
                ToastUtils.showShort("即將開啟藍(lán)牙")
                val openBluetoothIntent = Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE)
                openBluetoothActivityForResult.launch(openBluetoothIntent)
            }else{
                ToastUtils.showShort("藍(lán)牙以開啟")
            }
        }
    }

如果沒有開啟的話我們需要調(diào)用系統(tǒng)的開啟藍(lán)牙的Activity,并在onActivityResult中對(duì)結(jié)果進(jìn)行處理,這里我們用最新的registerForActivityResult來調(diào)用(注意:這里的代碼需在上一個(gè)方法執(zhí)行前執(zhí)行)

/**
     * 注冊(cè)請(qǐng)求開啟藍(lán)牙的Launcher
     */
    private fun registerActivityResultLauncher() {
        openBluetoothActivityForResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result->
            if (result.resultCode == RESULT_OK) {
                ToastUtils.showShort("藍(lán)牙開啟")
            }else{
                ToastUtils.showShort("未能開啟")
            }
        }
    }
4.掃描藍(lán)牙設(shè)備

掃描藍(lán)牙需要使用BluetoothAdapter的startDiscovery()方法,并且這里的掃描藍(lán)牙設(shè)備需要我們注冊(cè)廣播通過廣播來獲取掃描的設(shè)備

private val bluetoothScanBroadcastReceiver = object :BroadcastReceiver(){
        @SuppressLint("NotifyDataSetChanged")
        override fun onReceive(context: Context?, intent: Intent?) {
            intent?.let {
                when(it.action){
                    //開始掃描
                    BluetoothAdapter.ACTION_DISCOVERY_STARTED->{
                        ToastUtils.showShort("開始掃描")
                        LogUtils.eTag("藍(lán)牙","開始掃描")
                    }
                    //掃描到設(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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容