1.繼承關係
2.該類作用
BluetoothAdapter代表了移動設備的本地的藍牙適配器, 通過該藍牙適配器可以對藍牙進行基本操作, 例如 : 啓動設備發現(startDiscovery), 獲取已配對設備(getBoundedDevices), 通過mac藍牙地址獲取藍牙設備(getRemoteDevice), 從其它設備創建一個監聽連接(listenUsingRfcommWithServiceRecord);
BluetoothAdapter.getDefaultAdapter()該靜態方法可以獲取該適配器對象.
3.藍牙權限
android.permission.BLUETOOTH : 允許程序連接到已配對的藍牙設備, 請求連接/接收連接/傳輸數據需要改權限, 主要用於對配對後進行操作;
android.permission.BLUETOOTH_ADMIN : 允許程序發現和配對藍牙設備, 該權限用來管理藍牙設備, 有了這個權限, 應用才能使用本機的藍牙設備, 主要用於對配對前的操作;
優先級 : BLUETOOTH權限是BLUETOOTH_ADMIN權限的前提, 如果沒有BLUETOOTH權限, 就不能使用BLUETOOTH_ADMIN權限;
二 API詳解
1.常量介紹
(1)開關狀態值
藍牙關閉 : int STATE_OFF , 值爲10, 藍牙模塊處於關閉狀態;
藍牙打開中 : int STATE_TURNING_ON , 值爲11, 藍牙模塊正在打開;
藍牙開啓 : int STATE_ON , 值爲12, 藍牙模塊處於開啓狀態;
藍牙開啓中 : int STATE_TURNING_OFF , 值爲13, 藍牙模塊正在關閉;
藍牙開關狀態順序 : STATE_OFF --> STATE_TURNING_ON --> STATE_ON --> STATE_TURNING_OFF --> STATE_OFF;
(2)掃描狀態值
無功能狀態 : int SCAN_MODE_NONE , 值爲20, 查詢掃描和頁面掃描都失效, 該狀態下藍牙模塊既不能掃描其它設備, 也不可見;
掃描狀態 : int SCAN_MODE_CONNECTABLE , 值爲21, 查詢掃描失效, 頁面掃描有效, 該狀態下藍牙模塊可以掃描其它設備, 從可見性來說只對已配對的藍牙設備可見, 只有配對的設備才能主動連接本設備;
可見狀態 : int SCAN_MODE_CONNECTABLE_DISCOVERABLE, 值爲23, 查詢掃描和頁面掃描都有效;
查詢掃描功能 : 其它設備可以掃描到本設備 , 指的是可見性可見;
頁面掃描功能 : 可以主動掃描其它設備;
(3)藍牙操作接收的廣播
開始搜索廣播 : String ACTION_DISCOVERY_STARTED, 藍牙適配器開始搜索遠程設備, 值爲"android.bluetooth.action.DISCOVERY_START", 藍牙適配器開始搜索之後, 會先有12秒的查詢掃描(12s內可見), 查詢掃描後進行頁面掃描(主動搜索), 需要BLUETOOTH權限;
如果搜索到藍牙設備, 就會收到BluetoothDevice.ACTION_FOUND廣播, 可以從Intent中獲取存放在其中的BluetoothDevice對象, intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
設備查找非常消耗資源, 在查找的過程中, 不能連接遠程的藍牙設備, 已經存在的連接也要限制帶寬, 如果想要執行除查找外的其它操作, 之前最好調用cancelDiscovery();
搜索完成廣播 : String ACTION_DISCOVERY_FINISHED,藍牙S適配器完成搜索發出的廣播, 值爲"android.bluetooth.adapter.action.DISCOVERY_FINISHED", 需要BLUETOOTH權限;
藍牙名稱改變廣播 : String ACTION_LOCAL_NAME_CHANGED, 本地的藍牙適配器改變了自己的名稱, 值爲"android.bluetooth.adapter.action.LOCAL_NAME_CHANGED", 注意改變的是本設備名稱, 不是遠程設備的.這個廣播包含一個EXTRA_LOCAL_NAME附加域, 需要BLUETOOTH權限;
掃描模式變化廣播 : String ACTION_SCAN_MODE_CHANGED, 藍牙模塊掃描模式發生了變化, 值爲"android.bluetooth.adapter.action.SCAN_MODE_CHANGED", 該Intent對象包含了EXTRA_SCAN_MODE和EXTRA_PREVIOUS_SCAN_MODE, 兩個附加域分別是新的和舊的掃描模式, 這裏可以根據前後掃描模式的不同做出不同的操作, 需要BLUETOOTH權限;
開關模式變化廣播 : String ACTION_STATE_CHANGED, 藍牙模塊被打開或者關閉, 值爲"android.bluetooth.adapter.action.STATE_CHANGED", 該廣播的Intent中包含EXTRA_STATE和EXTRA_PREVIOUS_STATE兩個附加域, 需要BLUETOOTH權限;
(4)藍牙操作請求的廣播
開啓藍牙 : String ACTION_REQUEST_ENABLE, 打開藍牙, 值爲"android.bluetooth.adapter.action.REQUEST_ENABLE",
Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(intent, requestCode);
可以在Activity中的onActivityResult()方法中處理結果, 如果藍牙模塊打開成功, 則返回結果嗎RESULT_OK; 如果藍牙模塊打開失敗, 則返回結果碼RESULT_CANCELED;
打開和關閉藍牙模塊, 都可以通過ACTION_STATE_CHANGED廣播來監聽;
藍牙可見 : String ACTION_REQUEST_DISCOVERABLE,
使藍牙可見, 值爲"android.bluetooth.adapter.action.REQUEST_DISCOVERABLE", 默認的可見時間爲120s, 可以在廣播中添加附加域, 設置任意的可見時間, 附加域爲EXTRA_DISCOVERABLE_DURATION, 需要BLUETOOTH權限;
可以在Activity中的onActivityResult()方法中處理結果, 如果藍牙模塊設置可見成功, 則返回結果嗎RESULT_OK; 如果藍牙模塊設置可見失敗, 則返回結果碼RESULT_CANCELED;
Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 0);
startActivityForResult(discoverableIntent,resultCode)
(5)附加域
附加域是放在Intent中的, 使用Intent.putExtra(附加域,附加值)方法添加附加域;
掃描模式附加域 : 這兩個附加域的值是掃描模式, 可以爲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";
開關狀態附加域 : 這兩個附加域的值是開關狀態, 可以爲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";
藍牙名稱附加域 : String EXTRA_LOCAL_NAME , 存放ACTION_LOCAL_NAME_CHANGED附加域的附加值 , 值爲"android.bluetooth.adapter.extra.LOCAL_NAME";
可見時間附加域 : String EXTRA_DISCOVERABLE_DURATION, 存放的是ACTION_REQUEST_DISCOVERABLE廣播的可見時長, 值爲"android.bluetooth.adapter.extra.DISCOVERABLE_DURATION";
(6)錯誤碼
int ERROR , 這個值用來標記錯誤 , 方便自己使用的 , 沒有實際意義;
2.State狀態相關方法
(1)獲取藍牙適配器
public static sychronized BluetoothAdapter getDefaultAdapter();
返回值 : 本地藍牙適配器 BluetoothAdapter對象;
(2)獲取state狀態方法
public int getState();
作用 : 獲取是否可用
返回值 : 返回當前的State狀態值, STATE_ON, STATE_OFF, STATE_TURNING_ON, STATE_TURNING_OFF;
權限 : BLUETOOTH;
(3)藍牙是否可用
public boolean isEnable();
作用 : 獲取當前設備藍牙模塊是否可用;
返回值 : 返回當前藍牙模塊是否可用, true 可用, false 不可用;
權限 : BLUETOOTH權限;
(4)打開藍牙
public boolean enable();
作用 : 打開本地藍牙適配器;
返回值 : 如果打開成功則返回true, 如果打開失敗返回false;
權限 : BLUETOOTH_ADMIN權限;
(5)關閉藍牙
public boolean disable();
作用 : 關閉本地設備藍牙;
返回值 : 如果關閉藍牙成功, 返回true; 如果關閉藍牙失敗, 返回false;
權限 : BLUETOOTH_ADMIN權限;
3. 掃描相關方法
(1)開始掃描
public boolean startDiscovery();
作用 : 開始查找遠程藍牙設備, 先進行12秒的查詢掃描(被動可見), 之後進行頁面掃描(主動搜索); 搜索過成功不能嘗試對遠程設備的連接, 同時已連接的設備的帶寬也會被壓縮, 等待時間變長; 使用cancelDiscovery()可以終止搜索;
返回值 : 如果成功則返回true, 失敗返回false;
權限 : BLUETOOTH_ADMIN權限;
(2)是否在掃描中
public boolean isDiscovering();
作用 : 是否正在搜索;
返回值 : 如果設備正在搜索, 返回true; 如果設備沒有進行藍牙搜索, 返回false;
權限 : BLUETOOTH權限;
(3)取消查找
public boolean cancelDiscovery();
作用 : 取消藍牙搜索; 在進行connect()方法的時候, 必須調用這個方法, 藍牙搜索是一個服務進行, 在搜索中的時候, 不能進行連接;
返回值 : 如果取消成功, 則返回true; 如果取消失敗, 返回false;
(4)獲取掃描模式
public int getScanMode();
作用 : 獲取當前藍牙的掃描模式;
返回值 : SCAN_MODE_NONE, SCAN_MODE_CONNECTABLE, SCAN_MODE_DISCOVERABLE;
4.與藍牙設備相關的方法
(1)檢查藍牙地址
public boolean checkBluetoothAddress(String address);
作用 : 檢查藍牙地址是否合法, 藍牙地址字母必須大寫, 例如 : "00:43:A8:23:10:F0";
參數 : 17位的字符串, 例如 : "00:43:A8:23:10:F0";
返回值 : 如果藍牙地址合法返回true, 反之返回false;
(2)獲取本地藍牙地址
public String getAddress();
作用 : 返回本地藍牙的MAC地址;
返回值 : 本地的硬件地址;
(3)獲取本地藍牙名稱
public String getName();
返回值 : 本地藍牙設備的名稱;
(4)獲取綁定的藍牙集合
public Set<BluetoothDevice> getBoundedDevices();
作用 : 獲取已經配對的藍牙設備的集合, 如果藍牙未被打開, 則返回null;
(5)獲取遠程藍牙設備
public BluetoothDevice getRemoteDevice(String address);
作用 : 根據藍牙的物理地址獲取遠程的藍牙設備, 如果地址不合法, 就會產生異常;
返回值 : 獲取到的BluetoothDevice對象;
(6)創建監聽
public BluetoothServerSocket listenUsingRfcommonWithServiceRecord(String name, UUID uuid);
作用 : 創建一個監聽Rfcommon端口的藍牙監聽, 使用accept()方法監聽, 並獲取BluetoothSocket對象; 該系統會根據一個服務名稱(name)和唯一的識別碼(uuid)來創建一個SDP服務, 遠程藍牙設備可以根據唯一的UUID來連接這個SDP服務器;
參數 : name : SDP服務器名稱, UUID, SDP記錄下的UUID;
返回值 : 正在監聽藍牙端口;
權限 : BLUETOOTH;
三 常用用法
1.打開藍牙
//第一種打開方法: 調用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()方法去處理返回值
}
第一種方法打開藍牙, 沒有任何提示, 直接就打開了;
第二種方法發送廣播, 會彈出一個對話框, 選擇是否打開藍牙, 選擇是藍牙纔打開;
2.設置可見
private void setDiscoverable() {
Intent bluetoothIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
bluetoothIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 3600);
mContext.startActivity(bluetoothIntent);
}
發送ACTION_REQUEST_DISCOVERABLE廣播, 同時在EXTRA_DISCOVERABLE_DURATION附加域中加入可見時間, 單位是秒;
發送這個廣播, 會彈出一個對話框, 顯示是否可見3600秒;