【Android 應(yīng)用開發(fā)】BluetoothDevice詳解
一. BluetoothDevice簡介
1. 繼承關(guān)系
public static Class BluetoothDevice extends Object implement Parcelable
該類實(shí)現(xiàn)了Parcelable接口, 實(shí)現(xiàn)了Parcelable接口的類的對象可以封裝到Parcel對象中, 封裝后的數(shù)據(jù)可以通過Intent或者IPC傳遞;
實(shí)現(xiàn)Parcelable接口要點(diǎn) :
a. 實(shí)現(xiàn)writeTpParcl()方法 : 將數(shù)據(jù)寫入到Parcel對象中;
public void writeToParcel(Parcel out, int arg1)
{
// TODO Auto-generated method stub
out.writeBundle(this.mBundle);
}
b. 實(shí)現(xiàn)describeContents()方法 :
public int describeContents()
{
// TODO Auto-generated method stub
return 0;
}
c.實(shí)現(xiàn)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對象代表了一個(gè)遠(yuǎn)程的藍(lán)牙設(shè)備, 通過這個(gè)類可以查詢遠(yuǎn)程設(shè)備的物理地址, 名稱, 連接狀態(tài)等信息;
對這個(gè)類的操作, 會(huì)執(zhí)行在遠(yuǎn)程藍(lán)牙設(shè)備的硬件上.
對象獲取途徑 :
a. 調(diào)用BluetoothAdapter的getRemoteDevice(address)方法獲取物理地址對應(yīng)的該類對象;
b. 調(diào)用BluetoothAdapter的getBoundedDevices()方法, 可以獲取已經(jīng)配對的藍(lán)牙設(shè)備集合;
3. 需要權(quán)限
android.permission.BLUETOOTH?: 允許程序連接到已配對的藍(lán)牙設(shè)備, 請求連接/接收連接/傳輸數(shù)據(jù)需要改權(quán)限, 主要用于對配對后進(jìn)行操作;
android.permission.BLUETOOTH_ADMIN?:?允許程序發(fā)現(xiàn)和配對藍(lán)牙設(shè)備, 該權(quán)限用來管理藍(lán)牙設(shè)備, 有了這個(gè)權(quán)限, 應(yīng)用才能使用本機(jī)的藍(lán)牙設(shè)備, 主要用于對配對前的操作;
優(yōu)先級 : BLUETOOTH權(quán)限是BLUETOOTH_ADMIN權(quán)限的前提, 如果沒有BLUETOOTH權(quán)限, 就不能使用BLUETOOTH_ADMIN權(quán)限;
二 API詳解
1. 常量介紹
廣播的小規(guī)律 : 根據(jù)廣播的名稱可以猜測廣播的類型, 如果廣播常量名稱后面帶著ED, 是過去時(shí), 那么這個(gè)廣播是需要注冊接收的廣播, 如ACTION_DISCOVERY_STARTED, 這是藍(lán)牙設(shè)備開始搜索發(fā)出的廣播;
如果廣播常量名稱不是ED結(jié)尾的, 那么這個(gè)是可以自己發(fā)送的廣播, 例如藍(lán)牙開啟廣播 : ACTION_REQUEST_ENABLE(藍(lán)牙可用), ACTION_REQUEST_DISCOVERABLE(藍(lán)牙可見);
低級連接與高級連接 : ACL連接是低級連接, RFCOMM, L2CAP等連接是高級連接; 高級別的連接基于低級別的連接;
(1)ACL連接相關(guān)廣播常量
ACL連接 : 該連接是一種低級別的連接, ACL連接通過Android藍(lán)牙棧自動(dòng)進(jìn)行管理;
String ACTION_ACL_CONNECTED : android.bluetooth.device.action.ACL_CONNECTED,與遠(yuǎn)程設(shè)備建立了ACL連接發(fā)出的廣播, 包含EXTRA_DEVICE附加域, 該附加域中存放的是BluetoothDevice對象, 需要BLUETOOTH權(quán)限;
String ACTION_ACL_DISCONNECTED : android.bluetooth.device.action.ACL_DISCONNECTED,與遠(yuǎn)程設(shè)備斷開ACL連接后發(fā)出的廣播, 包含EXTRA_DEVICE附加域, 需要BLUETOOTH權(quán)限;
String ACTION_ACL_DISCONNECT_REQUESTED : android.bluetooth.device.action.ACL_DISCONNECT_REQUESTED, 底層發(fā)出斷開連接請求,ACL連接即將斷開; 友好的斷開連接時(shí)都會(huì)發(fā)出這個(gè)廣播, 低級連接即將斷開的時(shí)候, 應(yīng)該馬上中斷高級連接; 需要BLUETOOTH權(quán)限;
(2)遠(yuǎn)程設(shè)備的其它廣播常量
String ACTION_BOND_STATE_CHANGED : android.bluetooth.device.action.BOND_STATE_CHANGED, 遠(yuǎn)程藍(lán)牙設(shè)備狀態(tài)改變的時(shí)候發(fā)出這個(gè)廣播, 例如設(shè)備被匹配, 或者解除配對; 該廣播包含的附加域有 : EXTRA_DEVICE, EXTRA_BOND_STATE, EXTRA_BOND_PREVIOUS_STATE; 需要BLUETOOTH權(quán)限;
String ACTION_CLASS_CHANGED : android.bluetooth.device.action.CLASS_CHANGED, 一個(gè)遠(yuǎn)程設(shè)備的綁定狀態(tài)發(fā)生改變時(shí)發(fā)出廣播, 該廣播附加域有 EXTRA_DEVICE, EXTRA_BOND_STATE; 需要BLUETOOTH權(quán)限;
String ACTION_FOUND : android.bluetooth.device.action.FOUND,發(fā)現(xiàn)一個(gè)遠(yuǎn)程設(shè)備的時(shí)候發(fā)出該廣播; 這個(gè)廣播總是包含EXTRA_DEVICE, EXTRA_CLASS附加域, 如果這個(gè)藍(lán)牙可用的話, 還會(huì)包含EXTRA_NAME, EXTRA_RSSI附加域; 需要BLUETOOTH權(quán)限;
String ACTION_NAME_CHANGED : android.bluetooth.device.action.NAME_CHANGED,遠(yuǎn)程藍(lán)牙設(shè)備的名稱被發(fā)現(xiàn)改變 或者 第一次發(fā)現(xiàn)遠(yuǎn)程藍(lán)牙設(shè)備的名稱的時(shí)候發(fā)出該廣播, 該廣播包含附加域 EXTRA_DEVICE , EXTRA_NAME附加域; 需要BLUETOOTH權(quán)限;
(3)綁定狀態(tài)常量
已綁定 : intBOND_BONDED , 值為12; 遠(yuǎn)程設(shè)備已經(jīng)匹配; 本地存儲(chǔ)了一個(gè)該遠(yuǎn)程設(shè)備的共享連接, 本地設(shè)備和遠(yuǎn)程設(shè)備之間的通信可以被認(rèn)證和加密; 這個(gè)連接不是已經(jīng)連接成功, 時(shí)刻保持連接狀態(tài), 這個(gè)連接的作用是, 下次連接的時(shí)候不用再次建立新的藍(lán)牙連接;
綁定中 : intBOND_BONDING, 值為11; 本地設(shè)備與遠(yuǎn)程設(shè)備正在匹配中;
未匹配 : intBOND_NONE, 值為10; 本地設(shè)備與遠(yuǎn)程設(shè)備沒有連接, 本地不存在與遠(yuǎn)程設(shè)備共享的連接, 設(shè)備間的通信不能被認(rèn)證和加密;
(4)附加域常量
綁定狀態(tài) : StringEXTRA_BOND_STATE, int附加域, 值為android.bluetooth.device.extra.BOND_STATE, 這個(gè)附加域是ACTION_BOND_STATE_CHANGED的附加域, 可能的值為 BOND_BONDED, BOND_BONDING, BOND_NONE;
上一個(gè)綁定狀態(tài) : StringACTION_PREVIOUS_BOND_STATE, int附加域, 存放遠(yuǎn)程設(shè)備綁定狀態(tài), 值為"android.bluetooth.device.extra.PREVIOUS_BOND_STATE", 該附加域是ACTION_BOND_STATE_CHANGED廣播的附加域;
BluetoothClass : StringEXTRA_CLASS, Parcelable BluetoothClass附加域, 存放BluetoothClass對象; 值為android.bluetooth.device.extra.CLASS, 這個(gè)附加域是ACTION_FOUND , ACTION_CLASS_CHANGED 廣播的附加域;
BluetoothDevice : StringEXTRA_DEVICE, Parcelable BluetoothDevice附加域, 存放BluetoothDevice對象, 值為"android.bluetooth.device.extra.DEVICE", ?幾乎該類中的每個(gè)廣播都有該附加域;
藍(lán)牙名稱 : StringEXTRA_NAME, 藍(lán)牙名稱附加域, 存放藍(lán)牙名稱, 值為"android.bluetooth.device.extra.NAME", 這個(gè)附加域是ACTION_NAME_CHANGED , ACTION_FOUND廣播的附加域;
信號強(qiáng)度 : StringEXTRA_RSSI, 短整型附加域, 存放遠(yuǎn)程設(shè)備信號強(qiáng)度值; 值為"android.bluetooth.device.extra.NAME";
2.?公共方法介紹
(1)封裝到Parcel方法
public void writeToParcel (Parcel out, int flags)
參數(shù) : out , 要封裝到的目的對象; flags , 對象如何被寫入的附加標(biāo)志;
(2)描述內(nèi)容
public int describeContents ()
(2)建立BluetoothSocket連接
public BluetoothSocket createRfcommSocketToServiceRecord (UUID uuid)
作用 : 創(chuàng)建BluetoothSocket連接對象, 該方法創(chuàng)建的BluetoothSocket連接對象與 BluetoothAdapter的listenUsingRfcommWithServiceRecord方法創(chuàng)建的BluetoothServerSocket連接是對應(yīng)的, 調(diào)用BluetoothSocket對象的connect()方法創(chuàng)建一個(gè)連接, 通過UUID執(zhí)行對應(yīng)信道的SDP查找動(dòng)作;
如果兩個(gè)安卓手機(jī)之間進(jìn)行連接需要生成專用的UUID, 如果是對藍(lán)牙串口進(jìn)行連接, 就使用總所周知的SPP UUID 00001101-0000-1000-8000-00805F9B34FB
參數(shù) : 用來識別遠(yuǎn)程藍(lán)牙設(shè)備的UUID, 該UUID用來查詢RFCOMM通道的服務(wù)記錄;
返回值 : 創(chuàng)建的BluetoothSocket連接對象
(3)比較方法
public boolean equals (Object o)
參數(shù) : 對比的對象
返回值 : 如果兩個(gè)對象相等, 返回true, 反之返回false;
(4)獲取藍(lán)牙地址
public String getAddress ()
(5)獲取藍(lán)牙類
public BluetoothClass getBluetoothClass ()
(6)獲取設(shè)備的綁定狀態(tài)
public int getBondState ()
作用 : 獲取遠(yuǎn)程設(shè)備的狀態(tài), 可能會(huì)是BOND_BONDED, BOND_BONDING, BOND_NONE中的一個(gè);
(7)獲取設(shè)備的藍(lán)牙名稱
public String getName ()
作用 : 獲取遠(yuǎn)程的藍(lán)牙設(shè)備名稱
(8)獲取哈希值
public int hashCode ()
作用 : 獲取哈希值, 可以重寫這個(gè)方法
(9)字符串方法
public int hashCode ()
,
,
,
Android
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。