Android藍牙開發教程(一)——搜索藍牙設備

Android藍牙功能的開發一直是很多新手頭疼的問題,網上雖然也有很多教程貼,但大多都寫得不全面,不能讓我們真正掌握藍牙開發的基本知識。本教程主要講解搜索藍牙設備、藍牙設備之間的連接和藍牙之間的通訊三個主要模塊。掌握了這三個,基本就能進行簡單的藍牙開發了。

先上效果圖

這裏寫圖片描述

界面比較簡單。主要有三個按鈕,兩個文本和一個列表。三個按鈕主要對應打開藍牙,搜索設備和發送信息三個功能。兩個文本主要用於提示連接狀態和發送的消息以及獲取的消息。列表主要展示搜索到的藍牙設備。源碼在後面會提供。

要用到藍牙的功能,需要先在manifest中聲明一下藍牙的使用權限

<uses-permission android:name="android.permission.BLUETOOTH"/>
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

打開藍牙設備

BluetoothAdapter bTAdatper = BluetoothAdapter.getDefaultAdapter();
if(bTAdatper==null){
            Toast.makeText(this,"當前設備不支持藍牙功能",Toast.LENGTH_SHORT).show();
        }
        if(!bTAdatper.isEnabled()){
           /* Intent i = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivity(i);*/
            bTAdatper.enable();
        }
        //開啓被其它藍牙設備發現的功能
        if (bTAdatper.getScanMode() != BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE) {
            Intent i = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
            //設置爲一直開啓
            i.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 0);
            startActivity(i);
        }

開啓藍牙需要用到BluetoothAdapter,我們可以通過BluetoothAdapter.ACTION_REQUEST_ENABLE 提示用戶開啓,也可以bTAdatper.enable()直接開啓藍牙。

開啓藍牙後,需要設置藍牙爲可發現狀態,讓其他設備能夠搜索到。

i.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 0);
最後的參數設置爲0,可以讓藍牙設備一直處於可發現狀態。當我們需要設置具體可被發現的時間時,最多隻能設置300秒。
i.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);

搜索藍牙設備

成功開啓藍牙設備後,調用藍牙適配器的startDiscovery方法就可以搜索附近可連接的藍牙設備。另外我們可以調用cancelDiscovery()來取消搜索。

 mBluetoothAdapter.startDiscovery();
 mBluetoothAdapter.cancelDiscovery()

當我們開始搜索附近藍牙設備的時候,系統會發出三個搜索狀態的廣播:

BluetoothAdapter.ACTION_DISCOVERY_STARTED、
BluetoothDevice.ACTION_FOUND、
BluetoothAdapter.ACTION_DISCOVERY_FINISHED。

這三個分別對應開始搜索、搜索到設備、搜索結束。因此,我們可以定義一個廣播,來獲取這些狀態。

private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (BluetoothDevice.ACTION_FOUND.equals(action)) {
                BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                //避免重複添加已經綁定過的設備
                if (device.getBondState() != BluetoothDevice.BOND_BONDED) {
                    //此處的adapter是列表的adapter,不是BluetoothAdapter
                    adapter.add(device);
                    adapter.notifyDataSetChanged();
                }
            } else if (BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)) {
                Toast.makeText(MainActivity.this,"開始搜索",Toast.LENGTH_SHORT).show();
            } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
                Toast.makeText(MainActivity.this,"搜索完畢",Toast.LENGTH_SHORT).show();
            }
        }
    };

在這裏,我將搜索到的設備添加到列表中進行展示。

if (device.getBondState() != BluetoothDevice.BOND_BONDED)
系統會保存之前配對過的藍牙設備,這裏我們對搜索到的設備進行過濾,判斷是否設備是否已經配對過。因此,我們還可以直接獲取之前配對過的設備。

獲取配對過的藍牙設備

Set<BluetoothDevice> pairedDevices = bTAdatper.getBondedDevices();
        if (pairedDevices.size() > 0) {
            for (BluetoothDevice device : pairedDevices) {
                adapter.add(device);
            }
        }

至此,我們就成功地獲取到附近的藍牙設備。

歡迎繼續閱讀下一篇

Android藍牙開發教程(二)——連接藍牙設備

發佈了32 篇原創文章 · 獲贊 111 · 訪問量 26萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章