1. 程式人生 > >Android中藍芽的基本使用----BluetoothAdapter類簡介

Android中藍芽的基本使用----BluetoothAdapter類簡介

天氣逐漸熱了,自己也越來越懶了,雖然看著了很多東西,解決了很多問題,有些收穫卻不想寫著。主要有一下兩方面原因:

第一、以前寫的一些關於Android知識的Blog,都是在學習過程中發現網路上沒有相關知識,因此下了很大決心,才一步

一步碼字兒給貼出來。承蒙各位網友的厚愛,本部落格還是有些底子的。

第二、最近的工作態度發生了改變,不在像那麼以前充滿熱情,充滿力量,就著問題解決問題,自己都有點耐煩了。心裡

尋思著,也許是該改變些什麼了吧。

新的手機專案,又開始從事之前的Settings模組了,現在看看Settings模組,沒有了最開始的那種心虛,還是覺得挺熟悉的。

就是程式碼量太多了,看著有點頭大。

好吧。我們廢話就介紹到此了,下面開始正文。本節主要介紹藍芽—BluetoothAdapter的一些基本應用,一些簡單的Android

API的使用。

一、 BluetoothAdapter類介紹

BluetoothAdapter類簡單點來說就是代表了本裝置(手機、電腦等)的藍芽介面卡物件,通過它我們可以藍芽裝置進行基本

發了,主要有如下功能:

1、開關藍芽裝置

2、掃描藍芽裝置

3、設定/獲取藍芽狀態資訊,例如:藍芽狀態值、藍芽Name、藍芽Mac地址等;

由於網路上關於BluetoothAdapter的一些常用API函式都有了介紹,因此,我著重介紹一些BluetoothAdapter類疏忽的地方。

1、BluetoothAdapter STATE 狀態值 , 即開關狀態

intSTATE_OFF 藍芽已經關閉

intSTATE_ON 藍芽已經開啟

intSTATE_TURNING_OFF 藍芽處於關閉過程中 ,關閉ing

intSTATE_TURNING_ON 藍芽處於開啟過程中 ,開啟ing

上圖中 ,紅色線路圖表示藍芽由關閉狀態 轉向為開啟狀態的過程 ;

藍色線路表示藍芽由開啟狀態 轉向為關閉狀態的過程 ;

2、BluetoothAdapter SCAN_MOD狀態值 ,即掃描狀態

首先說明,可以掃描其他裝置的,當然它同時能被其他藍芽裝置掃碼。

int SCAN_MODE_CONNECTABLE 表明該藍芽可以掃描其他藍芽裝置

int SCAN_MODE_CONNECTABLE_DISCOVERABLE

表 明該藍芽裝置同時可以掃碼其他藍芽裝置,並且可以被其他藍芽裝置掃描到。

int SCAN_MODE_NONE : 該藍芽不能掃描以及被掃描。

3、獲得藍芽介面卡例項

public static synchronizedBluetoothAdaptergetDefaultAdapter()

功能:獲得本裝置的藍芽介面卡例項。

返回值:如果裝置具備藍芽功能,返回BluetoothAdapter例項;否則,返回null物件。

4、開啟/關閉藍芽的兩種方法:

4.1、開啟藍芽:

①、直接呼叫函式enable()去開啟藍芽裝置 ;

②、系統API去開啟藍芽裝置,該方式會彈出一個對話方塊樣式的Activity供使用者選擇是否開啟藍芽裝置。

注意:如果藍芽已經開啟,不會彈出該Activity介面。

PS:在目前Android手機中,是不支援在飛航模式下開啟藍芽的。如果藍芽已經開啟,那麼藍芽的開關狀態會隨著飛航模式

的狀態而發生改變。

程式碼示例分別如下:

//第一種開啟方法: 呼叫enable 即可
boolean result = mBluetoothAdapter.enable();

//
/第二種開啟方法 ,呼叫系統API去開啟藍芽
if (!mBluetoothAdapter.isEnabled()) //未開啟藍芽,才需要開啟藍芽
{
Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(intent, REQUEST_OPEN_BT_CODE);
//會以Dialog樣式顯示一個Activity , 我們可以在onActivityResult()方法去處理返回值
}

4.2、關閉藍芽

直接呼叫API 函式即disable()即可。

public booleandisable()

功能:關閉藍芽裝置。

返回值:該函式會立即返回。

true 表示關閉操作成功

false 表示藍芽操作失敗 , ①、當前藍芽已經關閉 ;②、其他一些異常情況

5、掃描藍芽裝置

public booleanstartDiscovery()

功能:掃描藍芽裝置

注意: 如果藍芽沒有開啟,該方法會返回false ,即不會開始掃描過程。

public booleancancelDiscovery()

功能: 取消掃描過程。

注意: 如果藍芽沒有開啟,該方法會返回false。

public booleanisDiscovering()

功能: 是否正在處於掃描過程中。

注意: 如果藍芽沒有開啟,該方法會返回false。

6、 獲取藍芽相關資訊

publicStringgetName()

功能:獲取藍芽裝置Name

publicStringgetAddress()

功能:獲取藍芽裝置的硬體地址(MAC地址),例如:00:11:22:AA:BB:CC

public booleansetName(Stringname)

功能:設定藍芽裝置的Name,

publicSet<BluetoothDevice>getBondedDevices()

功能:獲取與本機藍芽所有繫結的遠端藍芽資訊,以BluetoothDevice類例項(稍後講到)返回。

注意:如果藍芽為開啟,該函式會返回一個空集合 。

public static booleancheckBluetoothAddress(Stringaddress)

功能: 驗證藍芽裝置MAC地址是否有效。所有裝置地址的英文字母必須大寫,48位,形如:00:43:A8:23:10:F1 。

返回值: true 裝置地址有效

false 裝置地址無效

publicBluetoothDevicegetRemoteDevice(Stringaddress)

功能:以給定的MAC地址去建立一個BluetoothDevice類例項(代表遠端藍芽例項)。即使該藍芽地址不可見,也會產生

BluetoothDevice類例項。

返回:BluetoothDevice類例項 。注意,如果該藍芽裝置MAC地址不能被識別,其藍芽Name為null。

異常:如果MAC address無效,丟擲IllegalArgumentException

7、藍芽相關廣播

Action值 說明

ACTION_STATE_CHANGED 藍芽狀態值發生改變

ACTION_SCAN_MODE_CHANGED 藍芽掃描狀態(SCAN_MODE)發生改變

ACTION_DISCOVERY_STARTED 藍芽掃描過程開始

ACTION_DISCOVERY_FINISHED 藍芽掃描過程結束

ACTION_LOCAL_NAME_CHANGED 藍芽裝置Name發生改變

ACTION_REQUEST_DISCOVERABLE 請求使用者選擇是否使該藍芽能被掃描

PS:如果藍芽沒有開啟,使用者點選確定後,會首先開啟藍芽,繼而設定藍芽能被掃描。

ACTION_REQUEST_ENABLE 請求使用者選擇是否開啟藍芽

ACTION_FOUND(該常量欄位位於BluetoothDevice類中,稍後講到)

說明:藍芽掃描時,掃描到任一遠端藍芽裝置時,會發送此廣播。

通過註冊這個廣播,我們可以獲取掃描到的藍芽資訊。方法如下:

//掃描到了任一藍芽裝置
if(BluetoothDevice.ACTION_FOUND.equals(intent.getAction()))
{
   Log.v(TAG, "### BT BluetoothDevice.ACTION_FOUND ##");
                
   BluetoothDevice btDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                
   if(btDevice != null){
        Log.v(TAG , "Name : " + btDevice.getName() + " Address: " + btDevice.getAddress());
                    
   }
   else if(BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(intent.getAction()))
   {
        Log.v(TAG, "### BT ACTION_BOND_STATE_CHANGED ##");
                
        int cur_bond_state = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, BluetoothDevice.BOND_NONE);
        int previous_bond_state = intent.getIntExtra(BluetoothDevice.EXTRA_PREVIOUS_BOND_STATE, BluetoothDevice.BOND_NONE);
                
                
        Log.v(TAG, "### cur_bond_state ##" + cur_bond_state + " ~~ previous_bond_state" + previous_bond_state);
    }
}

最後,關於這些廣播的Intent資訊,還有很多附加值,大家可以去看看Android SDK。

更多關於BluetoothAdapter類的API介紹,請參考農民伯伯的部落格:

最後,在使用這兩個類時,需要以下兩個許可權:

BLUETOOTH 值為 "android.permission.BLUETOOTH"

BLUETOOTH_ADMIN 值為 "android.permission.BLUETOOTH_ADMIN"

二、 BluetoothDevice類介紹

該類就是關於遠端藍芽裝置的一個描述。通過它可以和本地藍芽裝置---BluetoothAdapter連線通訊。

1、 藍芽繫結(Bound)狀態 , 即藍芽裝置是否與其他藍芽繫結

int BOND_BONDED 表明藍芽已經繫結

int BOND_BONDING 表明藍芽正在繫結過程中 , bounding

int BOND_NONE 表明沒有繫結

更多關於BluetoothDevice類的更多介紹,請參考該農民伯伯的該篇部落格:

我也不再囉嗦了。

下面貼出一個小Demo吧,挺簡單的,也就是關藍芽API的基本操作和藍芽相關廣播的監聽,處於顯示目的方便性,本文對

藍芽相關資訊的獲取,都通過Log輸出。請大家注意。 截圖如下:

程式碼什麼的就不在張貼了,只是幫助大家學習過程中減少工作量而已,別無其他。

示例程式碼下載地址為:

最後關於如果連線某個藍芽裝置,就需要利用藍芽部分的隱藏API了,關於這方面,大家可以看看hellogv的部落格:

目前還沒有機會研究這方面知識,以後會嘗試的。 Good luck for U !