1. 程式人生 > >【Android 應用開發】BluetoothDevice詳解

【Android 應用開發】BluetoothDevice詳解

一. BluetoothDevice簡介

1. 繼承關係

public static Class BluetoothDevice extends Object implement Parcelable

該類實現了Parcelable介面, 實現了Parcelable介面的類的物件可以封裝到Parcel物件中, 封裝後的資料可以通過Intent或者IPC傳遞;

實現Parcelable介面要點

a. 實現writeTpParcl()方法 : 將資料寫入到Parcel物件中;

public void writeToParcel(Parcel out, int arg1) 
{ 
     // TODO Auto-generated method stub 
     out.writeBundle(this.mBundle); 
}

b. 實現describeContents()方法 : 

public int describeContents() 
{ 
        // TODO Auto-generated method stub 
        return 0; 
}

c.實現Parcelable.Creator介面 : 

public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { 
        public TrainInfo createFromParcel(Parcel in) 
        { 
            SampleBean ti=new SampleBean(); 
            ti.mBundle=in.readBundle(); 
            return ti; 
        }
        public SampleBean[] newArray(int size) 
        { 
            return new SampleBean[size]; 
        } 
};

2. 該類簡介

BluetoothDevice物件代表了一個遠端的藍芽裝置, 通過這個類可以查詢遠端裝置的實體地址, 名稱, 連線狀態等資訊;

對這個類的操作, 會執行在遠端藍芽裝置的硬體上.

物件獲取途徑 : 

a. 呼叫BluetoothAdapter的getRemoteDevice(address)方法獲取實體地址對應的該類物件;

b. 呼叫BluetoothAdapter的getBoundedDevices()方法, 可以獲取已經配對的藍芽裝置集合;

3. 需要許可權

android.permission.BLUETOOTH : 允許程式連線到已配對的藍芽裝置, 請求連線/接收連線/傳輸資料需要改許可權, 主要用於對配對後進行操作;

android.permission.BLUETOOTH_ADMIN : 允許程式發現和配對藍芽裝置, 該許可權用來管理藍芽裝置, 有了這個許可權, 應用才能使用本機的藍芽裝置, 主要用於對配對前的操作;

優先順序 : BLUETOOTH許可權是BLUETOOTH_ADMIN許可權的前提, 如果沒有BLUETOOTH許可權, 就不能使用BLUETOOTH_ADMIN許可權;


二 API詳解

1. 常量介紹

廣播的小規律 : 根據廣播的名稱可以猜測廣播的型別, 如果廣播常量名稱後面帶著ED, 是過去時, 那麼這個廣播是需要註冊接收的廣播, 如ACTION_DISCOVERY_STARTED, 這是藍芽裝置開始搜尋發出的廣播;

如果廣播常量名稱不是ED結尾的, 那麼這個是可以自己傳送的廣播, 例如藍芽開啟廣播 : ACTION_REQUEST_ENABLE(藍芽可用), ACTION_REQUEST_DISCOVERABLE(藍芽可見); 

低階連線與高階連線 : ACL連線是低階連線, RFCOMM, L2CAP等連線是高階連線; 高級別的連線基於低級別的連線;

(1)ACL連線相關廣播常量

ACL連線 : 該連線是一種低級別的連線, ACL連線通過Android藍芽棧自動進行管理;

String ACTION_ACL_CONNECTED : android.bluetooth.device.action.ACL_CONNECTED,與遠端裝置建立了ACL連線發出的廣播, 包含EXTRA_DEVICE附加域, 該附加域中存放的是BluetoothDevice物件, 需要BLUETOOTH許可權;

String ACTION_ACL_DISCONNECTED : android.bluetooth.device.action.ACL_DISCONNECTED,與遠端裝置斷開ACL連線後發出的廣播, 包含EXTRA_DEVICE附加域, 需要BLUETOOTH許可權;

String ACTION_ACL_DISCONNECT_REQUESTED : android.bluetooth.device.action.ACL_DISCONNECT_REQUESTED, 底層發出斷開連線請求,ACL連線即將斷開; 友好的斷開連線時都會發出這個廣播, 低階連線即將斷開的時候, 應該馬上中斷高階連線; 需要BLUETOOTH許可權;

(2)遠端裝置的其它廣播常量

String ACTION_BOND_STATE_CHANGED : android.bluetooth.device.action.BOND_STATE_CHANGED, 遠端藍芽裝置狀態改變的時候發出這個廣播, 例如裝置被匹配, 或者解除配對; 該廣播包含的附加域有 : EXTRA_DEVICE, EXTRA_BOND_STATE, EXTRA_BOND_PREVIOUS_STATE; 需要BLUETOOTH許可權;

String ACTION_CLASS_CHANGED : android.bluetooth.device.action.CLASS_CHANGED, 一個遠端裝置的繫結狀態發生改變時發出廣播, 該廣播附加域有 EXTRA_DEVICE, EXTRA_BOND_STATE; 需要BLUETOOTH許可權;

String ACTION_FOUND : android.bluetooth.device.action.FOUND,發現一個遠端裝置的時候發出該廣播; 這個廣播總是包含EXTRA_DEVICE, EXTRA_CLASS附加域, 如果這個藍芽可用的話, 還會包含EXTRA_NAME, EXTRA_RSSI附加域; 需要BLUETOOTH許可權;

String ACTION_NAME_CHANGED : android.bluetooth.device.action.NAME_CHANGED,遠端藍芽裝置的名稱被發現改變 或者 第一次發現遠端藍芽裝置的名稱的時候發出該廣播, 該廣播包含附加域 EXTRA_DEVICE , EXTRA_NAME附加域; 需要BLUETOOTH許可權;

(3)繫結狀態常量

已繫結 : intBOND_BONDED , 值為12; 遠端裝置已經匹配; 本地儲存了一個該遠端裝置的共享連線, 本地裝置和遠端裝置之間的通訊可以被認證和加密; 這個連線不是已經連線成功, 時刻保持連線狀態, 這個連線的作用是, 下次連線的時候不用再次建立新的藍芽連線;

繫結中 : intBOND_BONDING, 值為11; 本地裝置與遠端裝置正在匹配中;

未匹配 : intBOND_NONE, 值為10; 本地裝置與遠端裝置沒有連線, 本地不存在與遠端裝置共享的連線, 裝置間的通訊不能被認證和加密;

(4)附加域常量

繫結狀態 : StringEXTRA_BOND_STATE, int附加域, 值為android.bluetooth.device.extra.BOND_STATE, 這個附加域是ACTION_BOND_STATE_CHANGED的附加域, 可能的值為 BOND_BONDED, BOND_BONDING, BOND_NONE;

上一個繫結狀態 : StringACTION_PREVIOUS_BOND_STATE, int附加域, 存放遠端裝置繫結狀態, 值為"android.bluetooth.device.extra.PREVIOUS_BOND_STATE", 該附加域是ACTION_BOND_STATE_CHANGED廣播的附加域;

BluetoothClass : StringEXTRA_CLASS, Parcelable BluetoothClass附加域, 存放BluetoothClass物件; 值為android.bluetooth.device.extra.CLASS, 這個附加域是ACTION_FOUND , ACTION_CLASS_CHANGED 廣播的附加域;

BluetoothDevice : StringEXTRA_DEVICE, Parcelable BluetoothDevice附加域, 存放BluetoothDevice物件, 值為"android.bluetooth.device.extra.DEVICE",  幾乎該類中的每個廣播都有該附加域;

藍芽名稱 : StringEXTRA_NAME, 藍芽名稱附加域, 存放藍芽名稱, 值為"android.bluetooth.device.extra.NAME", 這個附加域是ACTION_NAME_CHANGED , ACTION_FOUND廣播的附加域;

訊號強度 : StringEXTRA_RSSI, 短整型附加域, 存放遠端裝置訊號強度值; 值為"android.bluetooth.device.extra.NAME";

2. 公共方法介紹

(1)封裝到Parcel方法

public void writeToParcel (Parcel out, int flags)
作用 : 將物件寫出到Parcel物件中, 這是實現的Parcelable介面的方法

引數 : out , 要封裝到的目的物件; flags , 物件如何被寫入的附加標誌;

(2)描述內容

public int describeContents ()
作用 : 實現Parcelable介面;

(2)建立BluetoothSocket連線

public BluetoothSocket createRfcommSocketToServiceRecord (UUID uuid)

作用 : 建立BluetoothSocket連線物件, 該方法建立的BluetoothSocket連線物件與 BluetoothAdapter的listenUsingRfcommWithServiceRecord方法建立的BluetoothServerSocket連線是對應的, 呼叫BluetoothSocket物件的connect()方法建立一個連線, 通過UUID執行對應通道的SDP查詢動作; 

如果兩個安卓手機之間進行連線需要生成專用的UUID, 如果是對藍芽串列埠進行連線, 就使用總所周知的SPP UUID 00001101-0000-1000-8000-00805F9B34FB

引數 : 用來識別遠端藍芽裝置的UUID, 該UUID用來查詢RFCOMM通道的服務記錄;

返回值 : 建立的BluetoothSocket連線物件

(3)比較方法

public boolean equals (Object o)
作用 : 比較呼叫該方法的物件與 o 物件, 如果相等, 返回true, 反之返回false;

引數 : 對比的物件

返回值 : 如果兩個物件相等, 返回true, 反之返回false;

(4)獲取藍芽地址

public String getAddress ()
作用 : 返回裝置的藍芽地址, 這個藍芽地址是17位的, 並且字母都是大寫字母;

(5)獲取藍芽類

public BluetoothClass getBluetoothClass ()
作用 : 獲取遠端裝置的藍芽類, 需要BLUETOOTH許可權, 如果出現錯誤, 返回null;

(6)獲取裝置的繫結狀態

public int getBondState ()

作用 : 獲取遠端裝置的狀態, 可能會是BOND_BONDED, BOND_BONDING, BOND_NONE中的一個;


(7)獲取裝置的藍芽名稱

public String getName ()

作用 : 獲取遠端的藍芽裝置名稱


(8)獲取雜湊值

public int hashCode ()

作用 : 獲取雜湊值, 可以重寫這個方法


(9)字串方法

public int hashCode ()
作用 : 預設情況下返回的藍芽的實體地址;

,

,

,