【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 ()
作用 : 預設情況下返回的藍芽的實體地址;,
,
,