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 !