【Android 应用开发】BluetoothAdapter解析
這篇文章將會(huì)詳細(xì)解析BluetoothAdapter的詳細(xì)api, 包括隱藏方法, 每個(gè)常量含義.?
一 BluetoothAdapter簡(jiǎn)介
1.繼承關(guān)系
該類(lèi)僅繼承了Object類(lèi);2.該類(lèi)作用
BluetoothAdapter代表了移動(dòng)設(shè)備的本地的藍(lán)牙適配器, 通過(guò)該藍(lán)牙適配器可以對(duì)藍(lán)牙進(jìn)行基本操作, 例如 : 啟動(dòng)設(shè)備發(fā)現(xiàn)(startDiscovery), 獲取已配對(duì)設(shè)備(getBoundedDevices), 通過(guò)mac藍(lán)牙地址獲取藍(lán)牙設(shè)備(getRemoteDevice), 從其它設(shè)備創(chuàng)建一個(gè)監(jiān)聽(tīng)連接(listenUsingRfcommWithServiceRecord);
BluetoothAdapter.getDefaultAdapter()該靜態(tài)方法可以獲取該適配器對(duì)象.
3.藍(lán)牙權(quán)限
android.permission.BLUETOOTH : 允許程序連接到已配對(duì)的藍(lán)牙設(shè)備, 請(qǐng)求連接/接收連接/傳輸數(shù)據(jù)需要改權(quán)限, 主要用于對(duì)配對(duì)后進(jìn)行操作;
android.permission.BLUETOOTH_ADMIN :?允許程序發(fā)現(xiàn)和配對(duì)藍(lán)牙設(shè)備, 該權(quán)限用來(lái)管理藍(lán)牙設(shè)備, 有了這個(gè)權(quán)限, 應(yīng)用才能使用本機(jī)的藍(lán)牙設(shè)備, 主要用于對(duì)配對(duì)前的操作;
優(yōu)先級(jí) : BLUETOOTH權(quán)限是BLUETOOTH_ADMIN權(quán)限的前提, 如果沒(méi)有BLUETOOTH權(quán)限, 就不能使用BLUETOOTH_ADMIN權(quán)限;
二 API詳解
1.常量介紹
(1)開(kāi)關(guān)狀態(tài)值
藍(lán)牙關(guān)閉 : int?STATE_OFF , 值為10, 藍(lán)牙模塊處于關(guān)閉狀態(tài);
藍(lán)牙打開(kāi)中 : int?STATE_TURNING_ON , 值為11, 藍(lán)牙模塊正在打開(kāi);
藍(lán)牙開(kāi)啟 : int?STATE_ON , 值為12, 藍(lán)牙模塊處于開(kāi)啟狀態(tài);
藍(lán)牙開(kāi)啟中 : int?STATE_TURNING_OFF , 值為13, 藍(lán)牙模塊正在關(guān)閉;
藍(lán)牙開(kāi)關(guān)狀態(tài)順序 : STATE_OFF --> STATE_TURNING_ON --> STATE_ON --> STATE_TURNING_OFF --> STATE_OFF;
(2)掃描狀態(tài)值
無(wú)功能狀態(tài) : int?SCAN_MODE_NONE , 值為20, 查詢掃描和頁(yè)面掃描都失效, 該狀態(tài)下藍(lán)牙模塊既不能掃描其它設(shè)備, 也不可見(jiàn);
掃描狀態(tài) : int?SCAN_MODE_CONNECTABLE , 值為21, 查詢掃描失效, 頁(yè)面掃描有效, 該狀態(tài)下藍(lán)牙模塊可以掃描其它設(shè)備, 從可見(jiàn)性來(lái)說(shuō)只對(duì)已配對(duì)的藍(lán)牙設(shè)備可見(jiàn), 只有配對(duì)的設(shè)備才能主動(dòng)連接本設(shè)備;
可見(jiàn)狀態(tài) : int?SCAN_MODE_CONNECTABLE_DISCOVERABLE, 值為23, 查詢掃描和頁(yè)面掃描都有效;
查詢掃描功能 : 其它設(shè)備可以掃描到本設(shè)備 , 指的是可見(jiàn)性可見(jiàn);
頁(yè)面掃描功能 : 可以主動(dòng)掃描其它設(shè)備;
(3)藍(lán)牙操作接收的廣播
開(kāi)始搜索廣播 : String?ACTION_DISCOVERY_STARTED, 藍(lán)牙適配器開(kāi)始搜索遠(yuǎn)程設(shè)備, 值為"android.bluetooth.action.DISCOVERY_START", 藍(lán)牙適配器開(kāi)始搜索之后, 會(huì)先有12秒的查詢掃描(12s內(nèi)可見(jiàn)), 查詢掃描后進(jìn)行頁(yè)面掃描(主動(dòng)搜索), 需要BLUETOOTH權(quán)限;
如果搜索到藍(lán)牙設(shè)備, 就會(huì)收到BluetoothDevice.ACTION_FOUND廣播, 可以從Intent中獲取存放在其中的BluetoothDevice對(duì)象, intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
設(shè)備查找非常消耗資源, 在查找的過(guò)程中, 不能連接遠(yuǎn)程的藍(lán)牙設(shè)備, 已經(jīng)存在的連接也要限制帶寬, 如果想要執(zhí)行除查找外的其它操作, 之前最好調(diào)用cancelDiscovery();
搜索完成廣播 : String?ACTION_DISCOVERY_FINISHED,藍(lán)牙S適配器完成搜索發(fā)出的廣播,?值為"android.bluetooth.adapter.action.DISCOVERY_FINISHED", 需要BLUETOOTH權(quán)限;
藍(lán)牙名稱(chēng)改變廣播 : String?ACTION_LOCAL_NAME_CHANGED, 本地的藍(lán)牙適配器改變了自己的名稱(chēng), 值為"android.bluetooth.adapter.action.LOCAL_NAME_CHANGED", 注意改變的是本設(shè)備名稱(chēng), 不是遠(yuǎn)程設(shè)備的.這個(gè)廣播包含一個(gè)EXTRA_LOCAL_NAME附加域, 需要BLUETOOTH權(quán)限;
掃描模式變化廣播 : String?ACTION_SCAN_MODE_CHANGED, 藍(lán)牙模塊掃描模式發(fā)生了變化, 值為"android.bluetooth.adapter.action.SCAN_MODE_CHANGED", 該Intent對(duì)象包含了EXTRA_SCAN_MODE和EXTRA_PREVIOUS_SCAN_MODE, 兩個(gè)附加域分別是新的和舊的掃描模式, 這里可以根據(jù)前后掃描模式的不同做出不同的操作, 需要BLUETOOTH權(quán)限;
開(kāi)關(guān)模式變化廣播 : String?ACTION_STATE_CHANGED, 藍(lán)牙模塊被打開(kāi)或者關(guān)閉, 值為"android.bluetooth.adapter.action.STATE_CHANGED", 該廣播的Intent中包含EXTRA_STATE和EXTRA_PREVIOUS_STATE兩個(gè)附加域, 需要BLUETOOTH權(quán)限;
(4)藍(lán)牙操作請(qǐng)求的廣播
開(kāi)啟藍(lán)牙 : String?ACTION_REQUEST_ENABLE, 打開(kāi)藍(lán)牙, 值為"android.bluetooth.adapter.action.REQUEST_ENABLE",?
Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(intent, requestCode);可以在Activity中的onActivityResult()方法中處理結(jié)果, 如果藍(lán)牙模塊打開(kāi)成功, 則返回結(jié)果嗎RESULT_OK; 如果藍(lán)牙模塊打開(kāi)失敗, 則返回結(jié)果碼RESULT_CANCELED;
打開(kāi)和關(guān)閉藍(lán)牙模塊, 都可以通過(guò)ACTION_STATE_CHANGED廣播來(lái)監(jiān)聽(tīng);
藍(lán)牙可見(jiàn) : String?ACTION_REQUEST_DISCOVERABLE, 使藍(lán)牙可見(jiàn), 值為"android.bluetooth.adapter.action.REQUEST_DISCOVERABLE", 默認(rèn)的可見(jiàn)時(shí)間為120s, 可以在廣播中添加附加域, 設(shè)置任意的可見(jiàn)時(shí)間, 附加域?yàn)镋XTRA_DISCOVERABLE_DURATION, 需要BLUETOOTH權(quán)限;
可以在Activity中的onActivityResult()方法中處理結(jié)果, 如果藍(lán)牙模塊設(shè)置可見(jiàn)成功, 則返回結(jié)果嗎RESULT_OK; 如果藍(lán)牙模塊設(shè)置可見(jiàn)失敗, 則返回結(jié)果碼RESULT_CANCELED;
Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 0); startActivityForResult(discoverableIntent,resultCode)
(5)附加域
附加域是放在Intent中的, 使用Intent.putExtra(附加域,附加值)方法添加附加域;
掃描模式附加域 : 這兩個(gè)附加域的值是掃描模式, 可以為SCAN_MODE_NONE, SCAN_MODE_CONNECTABLE, SCAN_MODE_CONNECTABLE_DISCOVERABLE;
String EXTRA_SCAN_MODE : 值為"android.bluetooth.adapter.extra.SCAN_MODE";
String EXTRA_PREVIOUS_SCAN_MODE : 值為"android.bluetooth.adapter.extra.PREVIOUS_SCAN_MODE";
開(kāi)關(guān)狀態(tài)附加域 : 這兩個(gè)附加域的值是開(kāi)關(guān)狀態(tài), 可以為STATE_OFF, STATE_ON, STATE_TURNING_OFF, STATE_TURNING_ON;
String EXTRA_STATE : 值為"android.bluetooth.adapter.extra.STATE";
String EXTRA_PREVIOUS_STATE : 值為"android.bluetooth.adapter.extra.PREVIOUS_STATE";
藍(lán)牙名稱(chēng)附加域 : String?EXTRA_LOCAL_NAME , 存放ACTION_LOCAL_NAME_CHANGED附加域的附加值 , 值為"android.bluetooth.adapter.extra.LOCAL_NAME";
可見(jiàn)時(shí)間附加域 : String?EXTRA_DISCOVERABLE_DURATION, 存放的是ACTION_REQUEST_DISCOVERABLE廣播的可見(jiàn)時(shí)長(zhǎng), 值為"android.bluetooth.adapter.extra.DISCOVERABLE_DURATION";
(6)錯(cuò)誤碼
int ERROR , 這個(gè)值用來(lái)標(biāo)記錯(cuò)誤 , 方便自己使用的 , 沒(méi)有實(shí)際意義;
2.State狀態(tài)相關(guān)方法
(1)獲取藍(lán)牙適配器
public static sychronized BluetoothAdapter getDefaultAdapter();返回值 : 本地藍(lán)牙適配器 BluetoothAdapter對(duì)象;
(2)獲取state狀態(tài)方法
public int getState();作用 : 獲取是否可用
返回值 : 返回當(dāng)前的State狀態(tài)值, STATE_ON, STATE_OFF, STATE_TURNING_ON, STATE_TURNING_OFF;
權(quán)限 : BLUETOOTH;
(3)藍(lán)牙是否可用
public boolean isEnable();作用 : 獲取當(dāng)前設(shè)備藍(lán)牙模塊是否可用;
返回值 : 返回當(dāng)前藍(lán)牙模塊是否可用, true 可用, false 不可用;
權(quán)限 : BLUETOOTH權(quán)限;
(4)打開(kāi)藍(lán)牙
public boolean enable();作用 : 打開(kāi)本地藍(lán)牙適配器;
返回值 : 如果打開(kāi)成功則返回true, 如果打開(kāi)失敗返回false;
權(quán)限 : BLUETOOTH_ADMIN權(quán)限;
(5)關(guān)閉藍(lán)牙
public boolean disable();作用 : 關(guān)閉本地設(shè)備藍(lán)牙;
返回值 : 如果關(guān)閉藍(lán)牙成功, 返回true; 如果關(guān)閉藍(lán)牙失敗, 返回false;
權(quán)限 : BLUETOOTH_ADMIN權(quán)限;
3. 掃描相關(guān)方法
(1)開(kāi)始掃描
public boolean startDiscovery();作用 : 開(kāi)始查找遠(yuǎn)程藍(lán)牙設(shè)備, 先進(jìn)行12秒的查詢掃描(被動(dòng)可見(jiàn)), 之后進(jìn)行頁(yè)面掃描(主動(dòng)搜索); 搜索過(guò)成功不能?chē)L試對(duì)遠(yuǎn)程設(shè)備的連接, 同時(shí)已連接的設(shè)備的帶寬也會(huì)被壓縮, 等待時(shí)間變長(zhǎng); 使用cancelDiscovery()可以終止搜索;
返回值 : 如果成功則返回true, 失敗返回false;
權(quán)限 :? BLUETOOTH_ADMIN權(quán)限;
(2)是否在掃描中
public boolean isDiscovering();作用 : 是否正在搜索;
返回值 : 如果設(shè)備正在搜索, 返回true; 如果設(shè)備沒(méi)有進(jìn)行藍(lán)牙搜索, 返回false;
權(quán)限 : BLUETOOTH權(quán)限;
(3)取消查找
public boolean cancelDiscovery();作用 : 取消藍(lán)牙搜索; 在進(jìn)行connect()方法的時(shí)候, 必須調(diào)用這個(gè)方法, 藍(lán)牙搜索是一個(gè)服務(wù)進(jìn)行, 在搜索中的時(shí)候, 不能進(jìn)行連接;
返回值 : 如果取消成功, 則返回true; 如果取消失敗, 返回false;
(4)獲取掃描模式
public int getScanMode();作用 : 獲取當(dāng)前藍(lán)牙的掃描模式;
返回值 : SCAN_MODE_NONE, SCAN_MODE_CONNECTABLE, SCAN_MODE_DISCOVERABLE;
4.與藍(lán)牙設(shè)備相關(guān)的方法
(1)檢查藍(lán)牙地址
public boolean checkBluetoothAddress(String address);作用 : 檢查藍(lán)牙地址是否合法, 藍(lán)牙地址字母必須大寫(xiě), 例如 : "00:43:A8:23:10:F0";
參數(shù) : 17位的字符串, 例如 : "00:43:A8:23:10:F0";
返回值 : 如果藍(lán)牙地址合法返回true, 反之返回false;
(2)獲取本地藍(lán)牙地址
public String getAddress();作用 : 返回本地藍(lán)牙的MAC地址;
返回值 : 本地的硬件地址;
(3)獲取本地藍(lán)牙名稱(chēng)
public String getName();返回值 : 本地藍(lán)牙設(shè)備的名稱(chēng);
(4)獲取綁定的藍(lán)牙集合
public Set<BluetoothDevice> getBoundedDevices();作用 : 獲取已經(jīng)配對(duì)的藍(lán)牙設(shè)備的集合, 如果藍(lán)牙未被打開(kāi), 則返回null;
(5)獲取遠(yuǎn)程藍(lán)牙設(shè)備
public BluetoothDevice getRemoteDevice(String address);作用 : 根據(jù)藍(lán)牙的物理地址獲取遠(yuǎn)程的藍(lán)牙設(shè)備, 如果地址不合法, 就會(huì)產(chǎn)生異常;
返回值 : 獲取到的BluetoothDevice對(duì)象;
(6)創(chuàng)建監(jiān)聽(tīng)
public BluetoothServerSocket listenUsingRfcommonWithServiceRecord(String name, UUID uuid);作用 : 創(chuàng)建一個(gè)監(jiān)聽(tīng)Rfcommon端口的藍(lán)牙監(jiān)聽(tīng), 使用accept()方法監(jiān)聽(tīng), 并獲取BluetoothSocket對(duì)象; 該系統(tǒng)會(huì)根據(jù)一個(gè)服務(wù)名稱(chēng)(name)和唯一的識(shí)別碼(uuid)來(lái)創(chuàng)建一個(gè)SDP服務(wù), 遠(yuǎn)程藍(lán)牙設(shè)備可以根據(jù)唯一的UUID來(lái)連接這個(gè)SDP服務(wù)器;
參數(shù) : name : SDP服務(wù)器名稱(chēng), UUID, SDP記錄下的UUID;
返回值 : 正在監(jiān)聽(tīng)藍(lán)牙端口;
權(quán)限 : BLUETOOTH;
三 常用用法
1.打開(kāi)藍(lán)牙
//第一種打開(kāi)方法: 調(diào)用enable 即可 boolean result = mBluetoothAdapter.enable(); // /第二種打開(kāi)方法 ,調(diào)用系統(tǒng)API去打開(kāi)藍(lán)牙 if (!mBluetoothAdapter.isEnabled()) //未打開(kāi)藍(lán)牙,才需要打開(kāi)藍(lán)牙 { Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(intent, REQUEST_OPEN_BT_CODE); //會(huì)以Dialog樣式顯示一個(gè)Activity , 我們可以在onActivityResult()方法去處理返回值 } 第一種方法打開(kāi)藍(lán)牙, 沒(méi)有任何提示, 直接就打開(kāi)了;第二種方法發(fā)送廣播, 會(huì)彈出一個(gè)對(duì)話框, 選擇是否打開(kāi)藍(lán)牙, 選擇是藍(lán)牙才打開(kāi);
2.設(shè)置可見(jiàn)
private void setDiscoverable() {Intent bluetoothIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);bluetoothIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 3600);mContext.startActivity(bluetoothIntent);}
發(fā)送ACTION_REQUEST_DISCOVERABLE廣播, 同時(shí)在EXTRA_DISCOVERABLE_DURATION附加域中加入可見(jiàn)時(shí)間, 單位是秒;
發(fā)送這個(gè)廣播, 會(huì)彈出一個(gè)對(duì)話框, 顯示是否可見(jiàn)3600秒;
?
總結(jié)
以上是生活随笔為你收集整理的【Android 应用开发】BluetoothAdapter解析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【Android 应用开发】Androi
- 下一篇: 【Android 应用开发】Blueto